library(ggplot2)
library(plotly)
# library(data.table)

library(tidyverse)

Producción

Fuentes:

Producción de Crudo

La producción de petróleo crudo de largo plazo proviene del Anuario de Combustibles, de la cual contamos datos desde 1911 hasta 1992. Sus valores para el período 1980-1992 coinciden con los de EIA, por lo cual pueden usarse como fuentes alternativas. Asimismo, la evolución de SESCO es similar a la de EIA, salvo por pequeñas divergencias entre 2008 y 2013. La serie de Regalías presenta un nivel menor que las anteriores debido a las deducciones de producción que realizan las empresas para pagar un menor nivel de Regalías hacia las provincias donde realizan la producción. Por último, la serie del Ministerio de Economía coincide con Regalías en sus primeros años, luego presenta un nivel intermedio entre Regalías y SESCO y a partir de 2009 toma a SESCO como fuente. Salvo el Anuario de Combustibles, el resto de las series presentan datos hasta los últimos años. Por lo tanto, el criterio de selección para la serie de producción con la que se realizarán los cálculos es el siguiente:

  • Criterio de cómputo para producicón de crudo:
    • 1911 a 1992: Anuario de combustibles
    • 1993 - actualidad: SESCO Downstream
# prod_crudo = fread("../resultados/data_viz/produccion_crudo.csv")

prod_crudo = read.csv("../resultados/data_viz/produccion_crudo.csv")

ggplotly(prod_crudo %>%

  mutate(regalias = case_when(regalias == 0 ~ NA_real_,
                                    T ~ regalias)) %>%
    select(-prod_crudo) %>%
  gather(key = fuente, value = valor, 4:ncol(.)) %>%
  ggplot(aes(anio, valor, color = fuente))+
  geom_line()+
  labs(title = "Gráfico 1. Producción de petróleo crudo.
        Argentina (1911 - 2020)",
       y = "Millones de Barriles",
       caption = "Fuente: elaboración propia en base a Anuario de Combustibles, EIA, Ministerio de Economía, Secretaría de Energía (Base Regalías y SESCO)")+
  # scale_y_continuous(labels=function(x) format(x, big.mark = ".", scientific = FALSE))+
  scale_y_continuous(labels = scales::unit_format(unit ="", scale = 1e-6))+
  theme(legend.position = "bottom"), width = 600, height = 400)


Tabla 1. Producción de petróleo crudo en Argentina según distintas fuentes (barriles)

Producción de Gas Natural

Al igual que en la producción de petróleo crudo, la serie de largo plazo de producción de gas proviene del Anuario de Combustibles, de la cual contamos datos desde 1913 hasta 1992. A diferencia del crudo, sus valores para el período 1980-1992 no coinciden con los de EIA, pero está última sí coincide con los de Regalías entre 1999 y 2015. En cambio, la serie de SESCO, tiende a continuar la evolución de EIA y Regalías, pero con el nivel del Anuario de Combustibles, por lo que ambos pares de series pueden empalmar coherentemente según su nivel. Nuevamente, los valores de la base de Regalías son menores debido a las deducciones de producción para tributar menos regalías. La serie del Ministerio de Economía toma los valores de SESCO.Por lo tanto, el criterio de selección para la serie de producción de gas para los cálculos es el siguiente:

  • Criterio de cómputo de la producción de gas:
    • 1911 a 1992: Anuario de combustibles
    • 1993 en adelante: SESCO Downstream
prod_gas = read_csv("../resultados/data_viz/produccion_gas.csv",    col_types = cols(...1 = col_skip()), 
    locale = locale(encoding = "ISO-8859-1"))

ggplotly(prod_gas %>%
           select(-prod_gas) %>%
  mutate(regalias = case_when(regalias == 0 ~ NA_real_,
                                    T ~ as.double(regalias))) %>%
  gather(key = fuente, value = valor, 4:ncol(.)) %>%
  ggplot(aes(anio, valor, color = fuente))+
  geom_line()+
  labs(title = "Gráfico 2. Producción de gas.
        Argentina (1913 - 2020)",
       y = "MMBTU",
       caption = "Fuente: elaboración propia en base a Anuario de Combustibles, EIA, Ministerio de Economía, Secretaría de Energía (Base Regalías y SESCO)")+
  scale_y_continuous(labels=function(x) format(x, big.mark = ".", scientific = FALSE))+
  theme(legend.position = "bottom"), width = 600, height = 400)


Tabla 2. Producción de gas natural en Argentina según distintas fuentes (MMBTU)

Precio Mercado Interno

Fuentes:

Precio Mercado Interno de Crudo

  • Criterio para precio_crudo:
    • 1963 a 1965: Kozulj y Pistonesi - Revista IDEE ajustado con el índice del precio del Anuario de YPF
    • 1989 a 1991: Anuario de YPF
    • 1966 a 1988: Kozulj y Pistonesi - Revista IDEE
    • 1992: MECON ajustado con la variación del Índice de precios internos al por mayor (IPIM)
    • 1993 en adelante: MECON
precio_mi_crudo = read.csv("../resultados/data_viz/precio_mi_crudo.csv")

ggplotly(precio_mi_crudo %>%
      select(-precio_crudo_mdoint) %>%
      mutate(regalias =
               case_when(regalias == 0 ~ NA_real_,
                          T ~ regalias)) %>%
  gather(key = variable, value = valor, 4:ncol(.)) %>%
  ggplot(aes(anio, valor, color = variable, shape = variable))+
  geom_line(alpha = 0.8)+
  labs(title = "Gráfico 3. Precios del mercado interno del petróleo crudo.
       Argentina (1963 - 2020)",
       y = "USD/barril")+
  theme(legend.position = "bottom"), width = 800, height = 600)

Tabla 3. Precio del mercado interno del petróleo crudo en Argentina según distintas fuentes (barriles)

Precio Mercado Interno de Gas Natural

  • Precio Mercado Interno de gas:
    • 1963 - 1969 & 1989 - 1992: Anuario de YPF
    • 1970 - 1988: Kozulj y Pistonesi - Revista IDEE
    • 1993 en adelante: Secretaría de Energía - Base Regalías


Tabla 4. Precio del mercado interno del gas natural en Argentina según distintas fuentes (barriles)

Precios de Referencia del Mercado Mundial

Precios de exportación desde Argentina, benchmarks y Precios del mercado de EEUU (solo gas, internos y de expo/impo)

Precios de Referencia del Crudo

  • Fuentes seleccionadas para precio_me_crudo:
    • entre 1962 y 1992: precio de exportación argentina de UN Comtrade (clasificación SITC as reported)
    • entre 1993-2001 y 2004-2014: precio de exportación argentina de Mecon
    • entre 2002 y 2003: precio de exportación de Argentina de UN Comtrade (Clasificación HS as reported)
    • 2014 en adelante: precio de exportación argentina de Secretaría de Energía (Regalías)
    • Valores faltantes previos a 1992 (1970 - 1985): Brent (Fuente: Inflation Data)
precios_referencia_y_expo_crudo = read.csv("../resultados/precio_expo_y_mdo_mundial_crudo.csv")
ggplotly(precios_referencia_y_expo_crudo %>%
  select(-c("...1", precio_me_crudo)) %>%
  gather(key = tipo_precio,
         value = valor,
         3:ncol(.)) %>%
  # filter(!(tipo_precio %in% c("precio_gas_bolivia_usd_idee", "precio_impo_gas_bolivia_MMBTU_comtrade",
  #                             "precio_expo_gas_comtrade", "precio_expo_gas_indec"))) %>%
  # filter(anio != 2002 & tipo_precio != "precio_expo_crudo_indec") %>%
  ggplot(aes(x = anio, y = valor, color = tipo_precio))+
  geom_line(alpha = 0.9) +
  theme(legend.position = "bottom")+
  labs(title = "Precios de exportación y referencia del mercado mundial del crudo",
       y = "USD/barriles") , width = 600, height = 400)

Diferencial de precios

# visualizacion diferencial de precio mdo interno
precio_crudo_mdoint <- readxl::read_excel("../resultados/argentina/renta_de_la_tierra_hidrocarburifera_arg.xlsx", sheet= "precio_interno_crudo")

precio_crudo_mdoext <- readxl::read_excel("../resultados/argentina/renta_de_la_tierra_hidrocarburifera_arg.xlsx", sheet= "precios_externo_crudo")

# precio_crudo_mdoint %>% 
#   select(anio, precio_crudo_mdoint) %>% 
#   left_join(precio_crudo_mdoext %>% 
#               select(anio,precio_me_crudo,  wti_eia ,brent_iea 
#                      ), by = "anio") %>% 
#   # select(-precio_crudo_mdoint) %>%
#   reshape2::melt(., id.vars="anio") %>% 
#   ggplot(aes(anio, value, color = variable))+
#   geom_line()+
#   labs(title = "Precio de venta al mercado interno, exportacion y referencias del petróleo crudo",
#        x = "Año", y = "USD/barril", caption = "Fuente: ver anexo metodológico")+
#   # theme_bw()+
#   theme_light()+
#   theme(legend.position = "bottom")+
#   scale_x_continuous(breaks = pretty(precio_crudo_mdoint$anio, n = 10)) 
# 
# ggsave("../resultados/argentina/precio_interno_vs_externo.jpg")

Precios de Referencia del Gas

  • Criterio de precio_externo_gas:
    • Años 1964 y 1965: Precio de importación de gas proveniente de Bolivia hacia Argentina de UN Comtrade
    • 1966 en adelante: Precio de exportacion de gas desde Bolivia a Argentina de UN Comtrade
    • Datos faltantes para los años previos a 1963 y período 1968-1971
precio_mdomundial_gas_MMBTU = read.csv("../resultados/data_viz/precio_mdomundial_gas_MMBTU.csv")
graf_precio_mdo_mundial_gas_mmbtu <- precio_mdomundial_gas_MMBTU %>%
  filter(precio_externo_gas < 25) %>%
  gather(key = tipo_precio,
         value = valor,
         3:ncol(.)) %>%
  filter(
    valor < 25,
    !(tipo_precio %in% c("bp_oil_mix_mean_oecd"
                              # , "precio_expo_gas_indec"
                              # "precio_gas_bolivia_usd_idee",
                              # "precio_impo_gas_arg_bolivia_comtrade",
                              # "precio_expo_gas_comtrade"
                              ))) %>%
  # filter(!(tipo_precio %in% c("precio_expo_gas_indec"))) %>%
  ggplot(aes(x = anio, y = valor, color = tipo_precio))+
  geom_line() +
  # theme(legend.position = "bottom")+
  theme(legend.position = "right")+
  labs(title = "Precios de exportación y referencia del mercado mundial del gas",
       y = "USD/MMBTU")
ggplotly(graf_precio_mdo_mundial_gas_mmbtu, width = 600, height = 400)

Exportaciones e Importaciones

Exportaciones e Importaciones de Crudo

  • Exportaciones de Crudo:
    • 1962 a 1993: UN Comtrade
    • 1994 en adelante: SESCO Downstream
    • Los datos faltantes de SESCO se completaron con MECON
    • Siguen habiendo datos faltantes para los años 1965, 1970-74, 1976-78, 1980-84

expo_usd_crudo = read.csv("../resultados/data_viz/expo_usd_crudo.csv")
expo_q_crudo = read.csv("../resultados/data_viz/expo_q_crudo.csv")

expo_q_crudo %>%
  select(-expo_crudo) %>%
  gather(key = fuente, value = valor , 3:ncol(.)) %>%
  ggplot(aes(x = anio, y = valor, color =fuente ))+
  geom_line()

expo_usd_crudo %>%
  select(-expo_crudo) %>%
  gather(key = fuente, value = valor , 3:ncol(.)) %>%
  ggplot(aes(x = anio, y = valor, color =fuente ))+
  geom_line()

Exportaciones e Importaciones de Gas

  • Fuentes seleccionadas:
  • 1962 a 1996: UN Comtrade,
  • 1997 en adelante: SESCO Downstream
  • Datos faltantes para los años 1999 y 2000

expo_usd_gas = read.csv("../resultados/data_viz/expo_usd_gas.csv")
expo_q_gas = read.csv("../resultados/data_viz/expo_q_gas.csv")

expo_q_gas %>%
  select(-expo_gas) %>%
  gather(key = fuente, value = valor , 3:ncol(.)) %>%
  ggplot(aes(x = anio, y = valor, color =fuente ))+
  geom_line()

expo_usd_gas %>%
    select(-expo_gas) %>%
  gather(key = fuente, value = valor , 3:ncol(.)) %>%
  ggplot(aes(x = anio, y = valor, color =fuente ))+
  geom_line()

Empleo, Remuneraciones y Masa Salarial (CCNN)

Valor total de la producción

Criterios metodológicos

Se presentan a continuación distintas estimaciones sobre la magnitud de riqueza presente en el sector hidrocarburífero: Valor Bruto y Agregado de Producción (VBP y VA), Consumo Interemedio (CI), Masa Salarial (MS) y Excedente Bruto de Explotación (EBE). El VBP surge de la valuación de la producción a sus precios correspondientes. El VA resulta de la diferencia entre el VBP y CI, el cual puede surgir originalmente de esta resta o a partir del coeficiente técnico de la Matriz Insumo Producto (MIP). El EBE constituye la plusvalía (PV) total de la rama, es decir, la suma de la renta de la tierra (RT) más la ganancia normal (Gnorm), y se obtiene luego de descontar la MS y los impuestos específicos (Imp) del VA. En todos los casos que se presentarán a continuación, los Imp se calcularon a partir de aplicar sobre el VBP un coeficiente resultante del peso de los impuestos promedio de la MIP de 1997. Lo mismo pasa con la estimación de la depreciación de capital o consumo de capital fijo (ConsKfijo), que se obtiene a partir de aplicar la tasa de depreciación promedio resultante de los balances de YPF (1998 - 2018) sobre el total de Propiedad, Planta y Equipo (PPyE) de la rama. Esta partida se aplica para obtener el Excedente Neto de Explotación. Se presentan distintas estimaciones para el VBP, CI y MS, que luego se observarán en la formulación matemática:

  • CCNN (ccnn_oficial)
    • Valores contables oficiales de las Cuentas Nacionales (sólo disponible para el período 2004-2012). Dado que se presentan series de VBP y VA, se pudo estimar el CI como la diferencia de dichas cuentas. Se procedió a separar el VBP a partir del peso del VBP de los servicios de apoyo a la extracción sobre el VBP de extracción de petróleo y gas, presente en el Cuadro de Utilización de Oferta (COU) de 2004 de INDEC. Se descontó esta proporción (resultante del 10,7%) del VBP total para obtener un VBP sólo de extracción. Dado que se posee información del salario promedio del sector y el empleo, se pudo obtener la MS resultante, tanto para el total del sector (extracción y servicios relacionados) como para sólo extracción. A partir de estos datos se elaboró un coeficiente que refleja el promedio de la proporción de la MS sobre el VBP que se utilizará en cálculos posteriores de MS total y MS de extracción.
  • Estimación propia con criterio CCNN (vbp_va_ci_propia)
    • Estimación propia de los valores contables a partir de las fuentes recopiladas, siguiendo los criterios de las Cuentas Nacionales. Es decir, para obtener el VBP se valua la producción destinada al mercado interno (resultante a partir de la diferencia entre producción y exportaciones) con los precios internos y las exportaciones con los precios de exportación, valuados tipo de cambio comercial (TCC). Se procedió también a separar el VBP de extracción neto de los servicios tal como se explicó anteriormente. El CI se estimó a partir de aplicar el coeficiente técnico (ratio CI/VBP) resultante de la MIP de 1997 (equivalente a 0.272). De igual manera, para calcular la masa salarial se aplicó el coeficiente de MS mencionado anteriormente. Finalmente, como se mencionó anteriormente, el VA el EBE se calcularon a partir de las diferencias mencionadas anteriormente.
  • Empalme CCNN (vbp_ccnn)
    • Estimación que toma los valores oficiales de las cuentas nacionales para el período donde se presentan datos (2004 -2012) y que imputa los valores faltantes por medio de la evolución del índice del VBP propio con criterio CCNN explicado anteriormente. Asimismo, se utilizaron los valores oficiales de la MS cuando se encontraba disponible el dato (1996-2018), mientras que se utilizó el valor propio estimado con criterio de las CCNN para los restantes años.
  • Criterio Propio (pv_hidrocarburos_propia)
    • Estimación propia que refleja con mayor precisión el valor de la riqueza total presente en el sector. El VBP se obtiene a paritr de valuar la totalidad de la producción a los precios externos o de referencia internacional y con el tipo de cambio de paridad (TCP), que mide la capacidad real de compra de la moneda nacional. Sin embargo, como el CI constituye intercambios de mercancías realizadas en el ámbito nacional, dicha partida se obtiene a partir de los valores obtenidos en la serie de empalme CCNN. De igual manera, se utilizó la MS resultante de esta última estimación.

Formulación matemática de estimaciones

Valor Bruto de Producción total, estimación con criterio propio \[VBP_{propia} = (Pext_{petróleo} * Q_{petróleo} + Pext_{gas} * Q_{gas}) * TCP\]

Donde:

  • \(VBP_{propia}\) = Valor Bruto de la Producción total, estimación propia
  • \(Pext_{petróleo}\) = Precio de exportación o referencia internacional del petróleo crudo (según corresponda)
  • \(Pext_{gas}\) = Precio de exportación o referencia internacional del gas natural (según corresponda)
  • \(Q_{petróleo}\) = Cantidades producidas totales de petróleo crudo
  • \(Q_{gas}\) = Cantidades producidas totales de gas natural
  • \(TCP\) = Tipo de Cambio de Paridad

Valor Bruto de Producción total, estimación con criterio CCNN \[VBP_{CCNN} = (Pint_{petróleo} * QMInt_{petróleo} + Pext_{petróleo} * Expo_{petróleo} + Pint_{gas} * QMInt_{gas} + Pext_{gas} * Expo_{gas})* TCC\]

Donde:

  • \(VBP_{CCNN}\) = Valor Bruto de la Producción total, estimación propia con criterio de las CCNN
  • \(Pint_{petróleo}\) = Precio mercado interno del petróleo crudo
  • \(Pint_{gas}\) = Precio mercado interno del gas natural
  • \(QMInt_{petróleo}\) = cantidades vendidas al mercado interno de petróleo crudo
  • \(QMInt_{gas}\) = cantidades vendidas al mercado interno del gas natural
  • \(Expo_{petróleo}\) = exportaciones de petróleo crudo
  • \(Expo_{gas}\) = exportaciones de gas natural
  • \(TCC\) = Tipo de Cambio Comercial


Valor Bruto de Producción extracción, estimación con criterio CCNN

\[VBP\_extr_{CCNN} = VBP_{CCNN} * (1-prop\_servicios)\]

Donde:

  • \(VBP\_extr_{CCNN}\) = Valor Bruto de la Producción extracción, estimación propia con criterio de las CCNN
  • \(prop\_extr\) = proporción del VBP de servicios de apoyo sobre VBP de extracción de petróleo y gas

Proporción de los servicios de apoyo sobre la extracción de petróleo y gas
\[prop\_servicios = \frac{VBP\_servicios_{COU}}{VBP\_extr_{COU} + VBP\_servicios_{COU}}\]

Donde:

  • \(VBP\_servicios_{COU}\) = VBP de servicios de apoyo del Cuadro de Utilización de Oferta
  • \(VBP\_extracción_{COU}\) = VBP de extracción de petróleo y gas del Cuadro de Utilización de Oferta


Consumo Intermedio, valores oficiales de las CCNN \[ CI_{CCNN} = VBP_{CCNN} - VA_{CCNN} \]

Donde:

  • \(CI_{CCNN}\) = Consumo Intermedio total, estimación propia
  • \(VA_{CCNN}\) = Valor Agregado, estimación de las CCNN


Consumo Intermedio, estimación con criterio CCNN \[ CI_{CCNN} = VBP_{CCNN} * Coef\_tec \] Donde:

  • \(Coef\_tec\) = Coeficiente técnico de Matriz Insumo Producto


Consumo Intermedio de extracción, estimación con criterio CCNN

\[ CI\_extr_{CCNN} = VBP\_extr_{CCNN} * Coef\_tec \]

Donde:

  • $ CI_extr_{CCNN}$ = Consumo Intermedio de extracción, estimación criterio CCNN


Masa Salarial, valores oficiales de las CCNN \[MS = W * Emp * 13\] Donde:

  • \(MS\) = Masa Salarial
  • \(W\) = Salario anual promedio
  • \(Emp\) = Empleo


Masa Salarial, estimación con criterio CCNN \[MS = VBP_{CCNN} * Coef\_MS\]

Donde:

  • \(Coef\_MS\) = Coeficiente de la proporción de MS sobre VBP


Masa Salarial de extracción, estimación con criterio CCNN \[MS\_extr = VBP\_extr_{CCNN} * Coef\_MS\]

Donde:

  • \(MS\_extr\) = Masa salarial del sector extracción


Valor agregado, estimación criterio CCNN \[VA_{CCNN} = VBP_{CCNN} – CI_{CCNN} \] Donde:

  • \(VA_{CCNN}\) = Valor Agregado, estimación propia con criterio CCNN


Valor agregado de extracción, estimación con criterio CCNN \[VA\_extr_{CCNN} = VBP\_extr_{CCNN} – CI\_extr_{CCNN} \]

Donde:

  • \(VA\_extr_{CCNN}\) = Valor Agregado de extracción, estimación propia con criterio CCNN


Valor agregado, estimación con criterio propio \[VA_{propia} = VBP_{propia} – CI\_extr_{CCNN} \]

Donde:

  • \(VA_{propia}\) = Valor Agregado, estimación con criterio propio


Excedente Bruto de Explotación, estimación con criterio CCNN \[EBE_{CCNN} = VA_{CCNN} – MS \]

Excedente Bruto de Explotación de extracción, estimación con criterio CCNN \[EBE\_extr_{CCNN} = VA\_extr_{CCNN} – MS\_extr \]


Excedente Bruto de Explotación, estimación con criterio propio \[EBE_{propia} = VA_{propia} – MS\_extr \]

Donde:

  • \(EBE\) = Excedente Bruto de Explotación
  • \(CI\_extr_{CCNN}\) = Consumo intermedio del sector extracción, estimación con criterio CCNN


Consumo de Capital Fijo, estimación con criterio propio \[ConKfijo = PPyE * prom(\frac{Dep}{PPyE}) \]

Donde:

  • \(ConKfijo\) = Consumo de Capital Fijo
  • \(PPyE\)= Propiedad, Planta y Equipo neta
  • $prom() $ = tasa de depreciación promedio
  • \(Dep\) = Depreciaciones (cuenta gastos por naturaleza)


Plusvalía (Excedente Neto de Explotación), estimación con criterio propio \[PV_{propia} = VA_{propia} - ConKfijo - Imp \]

Donde:

  • \(PV_{propia}\) = Plusvalía (Excedente Neto de Explotación)
  • \(Imp\) = Impuestos normales

Fuentes para la construcción de series

  • Producción de Crudo:
    • 1911 a 1992: Anuario de combustibles
    • 1993 - actualidad: SESCO Downstream
  • Exportaciones de Crudo:
    • 1962 a 1993: UN Comtrade (clasificación SITC as reported)
    • 1994 en adelante: SESCO Downstream
    • Los datos faltantes de SESCO se completaron con MECON
    • Siguen habiendo datos faltantes para los años 1965, 1970-74, 1976-78, 1980-84
  • Precio Mercado Interno de Crudo:
    • 1963 a 1965: Kozulj y Pistonesi - Revista IDEE ajustado con el índice del precio del Anuario de YPF
    • 1989 a 1991: Anuario de YPF
    • 1966 a 1988: Kozulj y Pistonesi - Revista IDEE
    • 1992: MECON ajustado con la variación del Índice de precios internos al por mayor (IPIM)
    • 1993 en adelante: MECON
  • Precio Mercado Externo Crudo:
    • entre 1962 y 1992: precio de exportación argentina de UN Comtrade
    • entre 1993-2001 y 2004-2014: precio de exportación argentina de Mecon
    • entre 2002 y 2003: precio de exportación de Argentina de UN Comtrade (Clasificación HS as reported)
    • 2014 en adelante: precio de exportación argentina de Secretaría de Energía (Regalías)
    • Valores faltantes previos a 1992: Brent (Fuente: Inflation Data)
  • Producción de Gas:
    • 1911 a 1992: Anuario de combustibles
    • 1993 en adelante: SESCO Downstream
  • Exportaciones de gas:
    • 1962 a 1996: UN Comtrade,
    • 1997 en adelante: SESCO Downstream
    • Datos faltantes para los años 1999 y 2000
  • Precio Mercado Interno de gas:
    • 1963 - 1969 & 1989 - 1992: Anuario de YPF
    • 1970 - 1988: Kozulj y Pistonesi - Revista IDEE
    • 1993 en adelante: Secretaría de Energía - Base Regalías
    • El dato del año 1992 se dividió por 10, dado que resultaba excesivamente alto, lo cual es metodológicamente inaceptable pero sirve de ejercicio.
  • Precio Mercado Externo:
    • Años 1964 y 1965: Precio de importación de gas proveniente de Bolivia hacia Argentina de UN Comtrade
    • 1966 en adelante: Precio de exportacion de gas desde Bolivia a Argentina de UN Comtrade
    • Datos faltantes para los años previos a 1963 y período 1968-1971
  • Valor Bruto de la Producción, Valor Agregado y Consumo Intermedio:
    • INDEC - Dirección Nacional de Cuentas Nacionales (Base Minería e Hidrocarburos de las Cuentas Nacionales). Las variables “extraccion_y_servicios_hidrocarburos” refieren a “Extracción de petróleo crudo y gas natural. Actividades de servicios relacionadas con la extracción de petróleo y gas, excepto las actividades de prospección”
    • Cálculo propio del VBP con datos datos de producción y precio internacional recopilados. Las fuentes son las siguientes (los criterios son los mismos para la utilización posterior en el cálculo de renta de la tierra hidrocarburífera por diferencial de precios, sobrevaluación cambiaria y otros mecanismos)
  • Salario y empleo
    • 1960-1996: estimación a partir de aplicación del coeficiente de proporción de la masa salarial sobre el VBP
    • 1996 en adelante: Ministerio de Trabajo, Empleo y Seguridad Social - Observatorio de Empleo y Dinámica Empresarial (OEDE)
  • Consumo de capital fijo
    • Coeficiente de depreciación estimado a partir de Estados Contables de YPF (1998-2018)
valor_total_produccion = read.csv("../resultados/data_viz/valor_total_produccion.csv")
graf_valor_produccion <- valor_total_produccion %>%
  filter(anio > 1960) %>%
  ggplot( aes(anio, valor, color = fuente))+
  geom_line(alpha = 0.7)+
  geom_point(size = 0.435, alpha = 0.2)+
  theme_classic()+
  theme(legend.position = "bottom")+
  labs(title = "Valor de la Producción hidrocarburífera",
       subtitle = "Valor total y componentes",
       y = "Millones de pesos de 2018")+
  facet_wrap(~variable)
gp <- ggplotly(graf_valor_produccion, width = 750, height = 800)
gp[['x']][['layout']][['annotations']][[2]][['x']] <- -0.11
gp %>% layout(margin = list(l = 75))

Inversiones

Sec energia

Balances


# PENSAR ALGO ASI PERO MAS ACEPTABLE 
# graf_stock_rama <- stock_rama %>%
#   # mutate(valor = number_format(valor, big.mark = " " )) %>%
#   filter(sector != "distribucion") %>%
#   ggplot(aes(anio, valor, color = sector, shape = fuente))+
#   geom_line()+
#   geom_point(size = .8)+
#   theme(legend.position = "bottom")+
#   labs(title = "Stock de capital adelantado y activo de segmentos",
#        subtitle = "Subsectores del sector hidrocarburífero",
#        y = "Millones de pesos de 2018")+
#   theme_classic()+
#   facet_wrap(~ variable )
# 
# ggplotly(graf_stock_rama, width = 800, height = 400)

Rentabilidad

\[TG_{hidrocarburos} = \frac{PV_{hidrocarburífera}}{KTA_{hidrocarburífero}}\]

Donde:

Por empresa

Por subsector

balances_arg %>%
  # filter(unidad == "Millones de pesos") %>%
  filter(moneda == "MM_pesos") %>% # ARREGLAR !!
  group_by(fecha, sector) %>%
  summarise("TG antes de impuestos" = sum(gcia_ant,na.rm = T)/sum (KTA,na.rm = T),
         "TG despues de impuestos" = sum(gcia_ant, impuesto_gcia, na.rm = T)/sum(KTA, na.rm = T ) ) %>%
  gather(key = variable, value = valor, 3:4) %>%
  filter(variable =="TG despues de impuestos") %>%
  ggplot(aes(fecha, valor, color = sector))+
  geom_line()+
  geom_point()+
  scale_y_continuous(labels = scales::percent)+
  labs(title = "Tasa de ganancia empresas hidrocarburos",
       subtitle =  "Antes y después de impuestos")+
  theme(axis.text.x = element_text(angle = 90))+
  facet_wrap(~variable)

Renta de la tierra hidrocarburífera

Método directo (descuentos sobre el VBP)

Método indirecto (suma de mecanismos)

Diferencial de precios

Sobrevaluacion cambiaria

Impuestos específicos

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkocGxvdGx5KQ0KIyBsaWJyYXJ5KGRhdGEudGFibGUpDQoNCmxpYnJhcnkodGlkeXZlcnNlKQ0KYGBgDQoNCiMjIFByb2R1Y2Npw7NuDQoNCkZ1ZW50ZXM6IA0KDQoqIFtNaW5pc3RlcmlvIGRlIEhhY2llbmRhLCBJbmZvcm1lcw0KU2VjdG9yaWFsZXNdKGh0dHBzOi8vd3d3LmFyZ2VudGluYS5nb2IuYXIvZWNvbm9taWEvcG9saXRpY2FlY29ub21pY2EvcmVnaW9uYWx5c2VjdG9yaWFsL2luZm9ybWVzcHJvZHVjdGl2b3MpICgxOTk4LWhveSkuIA0KKiBbU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEgLSBSZWdhbGlhc10oaHR0cDovL2RhdG9zLm1pbmVtLmdvYi5hci9kYXRhc2V0L3JlZ2FsaWFzLWRlLXBldHJvbGVvLWNydWRvLWdhcy1uYXR1cmFsLWdscC1nYXNvbGluYS15LWNvbmRlbnNhZG8pICgxOTk4LWhveSkNCiogW1NlY3JldGFyw61hIGRlIEVuZXJnw61hIC0gU0VTQ08gRG93bnN0cmVhbV0oaHR0cDovL2RhdG9zLm1pbmVtLmdvYi5hci9kYXRhc2V0L3Byb2R1Y2Npb24tZGUtcGV0cm9sZW8teS1nYXMtdGFibGFzLWRpbmFtaWNhcykoMTk5My1ob3kpDQoqIFtBbnVhcmlvIGRlIGNvbWJ1c3RpYmxlc10oaHR0cDovL2RhdG9zLm1pbmVtLmdvYi5hci9kYXRhc2V0L2FudWFyaW9zLWRlLWNvbWJ1c3RpYmxlcy0xOTUwLTE5OTkpICgxOTExLTE5OTIpDQoqIEtvenVsaiB5IFBpc3RvbmVzaS4gUmV2aXN0YSAgZGVsIEluc3RpdHV0byBkZSBFY29ub23DrWEgRW5lcmfDqXRpY2EgKElERUUpIC0gRnVuZGFjacOzbiBCYXJpbG9jaGUgICgxOTcwIC0gMTk4OCkNCiogW0VJQV0oaHR0cHM6Ly93d3cuZWlhLmdvdi9pbnRlcm5hdGlvbmFsL2RhdGEvY291bnRyeS9BUkcvcGV0cm9sZXVtLWFuZC1vdGhlci1saXF1aWRzL2FubnVhbC1wZXRyb2xldW0tYW5kLW90aGVyLWxpcXVpZHMtcHJvZHVjdGlvbj9wZD01JnA9MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMHZnJnU9MCZmPUEmdj1tYXBidWJibGUmYT0tJmk9bm9uZSZ2bz12YWx1ZSYmdD1DJmc9bm9uZSZsPTI0OS0tNiZzPTk0Njk0NDAwMDAwJmU9MTU0NjMwMDgwMDAwMCkgKDE5ODAgLSAyMDE5KQ0KDQojIyMgUHJvZHVjY2nDs24gZGUgQ3J1ZG8NCg0KDQpMYSBwcm9kdWNjacOzbiBkZSBwZXRyw7NsZW8gY3J1ZG8gZGUgbGFyZ28gcGxhem8gcHJvdmllbmUgZGVsIEFudWFyaW8gZGUgQ29tYnVzdGlibGVzLCBkZSBsYSBjdWFsIGNvbnRhbW9zIGRhdG9zIGRlc2RlIDE5MTEgaGFzdGEgMTk5Mi4gU3VzIHZhbG9yZXMgcGFyYSBlbCBwZXLDrW9kbyAxOTgwLTE5OTIgY29pbmNpZGVuIGNvbiBsb3MgZGUgRUlBLCBwb3IgbG8gY3VhbCBwdWVkZW4gdXNhcnNlIGNvbW8gZnVlbnRlcyBhbHRlcm5hdGl2YXMuIEFzaW1pc21vLCBsYSBldm9sdWNpw7NuIGRlIFNFU0NPIGVzIHNpbWlsYXIgYSBsYSBkZSBFSUEsIHNhbHZvIHBvciBwZXF1ZcOxYXMgZGl2ZXJnZW5jaWFzIGVudHJlIDIwMDggeSAyMDEzLiBMYSBzZXJpZSBkZSBSZWdhbMOtYXMgcHJlc2VudGEgdW4gbml2ZWwgbWVub3IgcXVlIGxhcyBhbnRlcmlvcmVzIGRlYmlkbyBhIGxhcyBkZWR1Y2Npb25lcyBkZSBwcm9kdWNjacOzbiBxdWUgcmVhbGl6YW4gbGFzIGVtcHJlc2FzIHBhcmEgcGFnYXIgdW4gbWVub3Igbml2ZWwgZGUgUmVnYWzDrWFzIGhhY2lhIGxhcyBwcm92aW5jaWFzIGRvbmRlIHJlYWxpemFuIGxhIHByb2R1Y2Npw7NuLiBQb3Igw7psdGltbywgbGEgc2VyaWUgZGVsIE1pbmlzdGVyaW8gZGUgRWNvbm9tw61hIGNvaW5jaWRlIGNvbiBSZWdhbMOtYXMgZW4gc3VzIHByaW1lcm9zIGHDsW9zLCBsdWVnbyBwcmVzZW50YSB1biBuaXZlbCBpbnRlcm1lZGlvIGVudHJlIFJlZ2Fsw61hcyB5IFNFU0NPIHkgYSBwYXJ0aXIgZGUgMjAwOSB0b21hIGEgU0VTQ08gY29tbyBmdWVudGUuIFNhbHZvIGVsIEFudWFyaW8gZGUgQ29tYnVzdGlibGVzLCBlbCByZXN0byBkZSBsYXMgc2VyaWVzIHByZXNlbnRhbiBkYXRvcyBoYXN0YSBsb3Mgw7psdGltb3MgYcOxb3MuIFBvciBsbyB0YW50bywgZWwgY3JpdGVyaW8gZGUgc2VsZWNjacOzbiBwYXJhIGxhIHNlcmllIGRlIHByb2R1Y2Npw7NuIGNvbiBsYSBxdWUgc2UgcmVhbGl6YXLDoW4gbG9zIGPDoWxjdWxvcyBlcyBlbCBzaWd1aWVudGU6DQoNCiogQ3JpdGVyaW8gZGUgY8OzbXB1dG8gcGFyYSBwcm9kdWNpY8OzbiBkZSBjcnVkbzogDQogICsgMTkxMSBhIDE5OTI6IEFudWFyaW8gZGUgY29tYnVzdGlibGVzIA0KICArIDE5OTMgLSBhY3R1YWxpZGFkOiBTRVNDTyBEb3duc3RyZWFtDQoNCg0KDQpgYGB7cn0NCiMgcHJvZF9jcnVkbyA9IGZyZWFkKCIuLi9yZXN1bHRhZG9zL2RhdGFfdml6L3Byb2R1Y2Npb25fY3J1ZG8uY3N2IikNCg0KcHJvZF9jcnVkbyA9IHJlYWQuY3N2KCIuLi9yZXN1bHRhZG9zL2RhdGFfdml6L3Byb2R1Y2Npb25fY3J1ZG8uY3N2IikNCg0KZ2dwbG90bHkocHJvZF9jcnVkbyAlPiUNCiAgbXV0YXRlKHJlZ2FsaWFzID0gY2FzZV93aGVuKHJlZ2FsaWFzID09IDAgfiBOQV9yZWFsXywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiByZWdhbGlhcykpICU+JQ0KICAgIHNlbGVjdCgtcHJvZF9jcnVkbykgJT4lDQogIGdhdGhlcihrZXkgPSBmdWVudGUsIHZhbHVlID0gdmFsb3IsIDQ6bmNvbCguKSkgJT4lDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gZnVlbnRlKSkrDQogIGdlb21fbGluZSgpKw0KICBsYWJzKHRpdGxlID0gIkdyw6FmaWNvIDEuIFByb2R1Y2Npw7NuIGRlIHBldHLDs2xlbyBjcnVkby4NCiAgICAgICAgQXJnZW50aW5hICgxOTExIC0gMjAyMCkiLA0KICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgQmFycmlsZXMiLA0KICAgICAgIGNhcHRpb24gPSAiRnVlbnRlOiBlbGFib3JhY2nDs24gcHJvcGlhIGVuIGJhc2UgYSBBbnVhcmlvIGRlIENvbWJ1c3RpYmxlcywgRUlBLCBNaW5pc3RlcmlvIGRlIEVjb25vbcOtYSwgU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEgKEJhc2UgUmVnYWzDrWFzIHkgU0VTQ08pIikrDQogICMgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1mdW5jdGlvbih4KSBmb3JtYXQoeCwgYmlnLm1hcmsgPSAiLiIsIHNjaWVudGlmaWMgPSBGQUxTRSkpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjp1bml0X2Zvcm1hdCh1bml0ID0iIiwgc2NhbGUgPSAxZS02KSkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSwgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCmBgYA0KDQo8YnI+DQoqKlRhYmxhIDEuIFByb2R1Y2Npw7NuIGRlIHBldHLDs2xlbyBjcnVkbyBlbiBBcmdlbnRpbmEgc2Vnw7puIGRpc3RpbnRhcyBmdWVudGVzIChiYXJyaWxlcykqKg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnByb2RfbWVyZ2VfY3J1ZG8gJT4lIA0KICBzZWxlY3QoLXByb2RfY3J1ZG8pDQogDQpgYGANCg0KDQoNCiMjIyBQcm9kdWNjacOzbiBkZSBHYXMgTmF0dXJhbA0KDQpBbCBpZ3VhbCBxdWUgZW4gbGEgcHJvZHVjY2nDs24gZGUgcGV0csOzbGVvIGNydWRvLCBsYSBzZXJpZSBkZSBsYXJnbyBwbGF6byBkZSBwcm9kdWNjacOzbiBkZSBnYXMgcHJvdmllbmUgZGVsIEFudWFyaW8gZGUgQ29tYnVzdGlibGVzLCBkZSBsYSBjdWFsIGNvbnRhbW9zIGRhdG9zIGRlc2RlIDE5MTMgaGFzdGEgMTk5Mi4gQSBkaWZlcmVuY2lhIGRlbCBjcnVkbywgc3VzIHZhbG9yZXMgcGFyYSBlbCBwZXLDrW9kbyAxOTgwLTE5OTIgbm8gY29pbmNpZGVuIGNvbiBsb3MgZGUgRUlBLCBwZXJvIGVzdMOhIMO6bHRpbWEgc8OtIGNvaW5jaWRlIGNvbiBsb3MgZGUgUmVnYWzDrWFzIGVudHJlIDE5OTkgeSAyMDE1LiBFbiBjYW1iaW8sIGxhIHNlcmllIGRlIFNFU0NPLCB0aWVuZGUgYSBjb250aW51YXIgbGEgZXZvbHVjacOzbiBkZSBFSUEgeSBSZWdhbMOtYXMsIHBlcm8gY29uIGVsIG5pdmVsIGRlbCBBbnVhcmlvIGRlIENvbWJ1c3RpYmxlcywgcG9yIGxvIHF1ZSBhbWJvcyBwYXJlcyBkZSBzZXJpZXMgcHVlZGVuIGVtcGFsbWFyIGNvaGVyZW50ZW1lbnRlIHNlZ8O6biBzdSBuaXZlbC4gTnVldmFtZW50ZSwgbG9zIHZhbG9yZXMgZGUgbGEgYmFzZSBkZSBSZWdhbMOtYXMgc29uIG1lbm9yZXMgZGViaWRvIGEgbGFzIGRlZHVjY2lvbmVzIGRlIHByb2R1Y2Npw7NuIHBhcmEgdHJpYnV0YXIgbWVub3MgcmVnYWzDrWFzLiBMYSBzZXJpZSBkZWwgTWluaXN0ZXJpbyBkZSBFY29ub23DrWEgdG9tYSBsb3MgdmFsb3JlcyBkZSBTRVNDTy5Qb3IgbG8gdGFudG8sIGVsIGNyaXRlcmlvIGRlIHNlbGVjY2nDs24gcGFyYSBsYSBzZXJpZSBkZSBwcm9kdWNjacOzbiBkZSBnYXMgcGFyYSBsb3MgY8OhbGN1bG9zIGVzIGVsIHNpZ3VpZW50ZToNCg0KKiBDcml0ZXJpbyBkZSBjw7NtcHV0byBkZSBsYSBwcm9kdWNjacOzbiBkZSBnYXM6DQogICsgMTkxMSBhIDE5OTI6IEFudWFyaW8gZGUgY29tYnVzdGlibGVzIA0KICArIDE5OTMgZW4gYWRlbGFudGU6IFNFU0NPIERvd25zdHJlYW0NCiAgDQogIA0KYGBge3J9DQpwcm9kX2dhcyA9IHJlYWRfY3N2KCIuLi9yZXN1bHRhZG9zL2RhdGFfdml6L3Byb2R1Y2Npb25fZ2FzLmNzdiIsICAgIGNvbF90eXBlcyA9IGNvbHMoLi4uMSA9IGNvbF9za2lwKCkpLCANCiAgICBsb2NhbGUgPSBsb2NhbGUoZW5jb2RpbmcgPSAiSVNPLTg4NTktMSIpKQ0KDQpnZ3Bsb3RseShwcm9kX2dhcyAlPiUNCiAgICAgICAgICAgc2VsZWN0KC1wcm9kX2dhcykgJT4lDQogIG11dGF0ZShyZWdhbGlhcyA9IGNhc2Vfd2hlbihyZWdhbGlhcyA9PSAwIH4gTkFfcmVhbF8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gYXMuZG91YmxlKHJlZ2FsaWFzKSkpICU+JQ0KICBnYXRoZXIoa2V5ID0gZnVlbnRlLCB2YWx1ZSA9IHZhbG9yLCA0Om5jb2woLikpICU+JQ0KICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IGZ1ZW50ZSkpKw0KICBnZW9tX2xpbmUoKSsNCiAgbGFicyh0aXRsZSA9ICJHcsOhZmljbyAyLiBQcm9kdWNjacOzbiBkZSBnYXMuDQogICAgICAgIEFyZ2VudGluYSAoMTkxMyAtIDIwMjApIiwNCiAgICAgICB5ID0gIk1NQlRVIiwNCiAgICAgICBjYXB0aW9uID0gIkZ1ZW50ZTogZWxhYm9yYWNpw7NuIHByb3BpYSBlbiBiYXNlIGEgQW51YXJpbyBkZSBDb21idXN0aWJsZXMsIEVJQSwgTWluaXN0ZXJpbyBkZSBFY29ub23DrWEsIFNlY3JldGFyw61hIGRlIEVuZXJnw61hIChCYXNlIFJlZ2Fsw61hcyB5IFNFU0NPKSIpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPWZ1bmN0aW9uKHgpIGZvcm1hdCh4LCBiaWcubWFyayA9ICIuIiwgc2NpZW50aWZpYyA9IEZBTFNFKSkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSwgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCmBgYA0KICANCiAgDQogIDxicj4NCioqVGFibGEgMi4gUHJvZHVjY2nDs24gZGUgZ2FzIG5hdHVyYWwgZW4gQXJnZW50aW5hIHNlZ8O6biBkaXN0aW50YXMgZnVlbnRlcyAoTU1CVFUpKioNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpwcm9kX21lcmdlX2dhc19NTUJUVSAlPiUgDQogIHNlbGVjdCgtcHJvZF9nYXMpDQoNCmBgYA0KDQoNCiAgDQojIyBQcmVjaW8gTWVyY2FkbyBJbnRlcm5vDQoNCiAgRnVlbnRlczogDQoNCiogW0Jhc2UgTWluaXN0ZXJpbyBkZSBIYWNpZW5kYSwgSW5mb3JtZXMNClNlY3RvcmlhbGVzXShodHRwczovL3d3dy5hcmdlbnRpbmEuZ29iLmFyL2Vjb25vbWlhL3BvbGl0aWNhZWNvbm9taWNhL3JlZ2lvbmFseXNlY3RvcmlhbC9pbmZvcm1lc3Byb2R1Y3Rpdm9zKQ0KKiBbU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEtUmVnYWxpYXNdKGh0dHA6Ly9kYXRvcy5taW5lbS5nb2IuYXIvZGF0YXNldC9yZWdhbGlhcy1kZS1wZXRyb2xlby1jcnVkby1nYXMtbmF0dXJhbC1nbHAtZ2Fzb2xpbmEteS1jb25kZW5zYWRvKQ0KICArIFBvciBhdXNlbmNpYSBkZSBpbmZvcm1hY2nDs24sIGVsIHByZWNpbyBkZSByZWdhbGlhcyBlbnRyZSAxOTkzIHkgMTk5OCBlcyBlbCBwcmVjaW8gdG90YWwgKGVzIGRlY2lyLCBlcyB1biBwb25kZXJhZG8gcXVlIGluY2x1eWUgdGFtYmnDqW4gZWwgcHJlY2lvIGRlbCBtZXJjYWRvIGV4dGVybm8pLiBFbiBsb3MgYcOxb3MgcG9zdGVyaW9yZXMsIGRpY2hvIHByZWNpbyBzw60gY29ycmVzcG9uZGUgYWwgZGVsIG1lcmNhZG8gaW50ZXJuby4gIA0KKiBLb3p1bGogeSBQaXN0b25lc2kuIFJldmlzdGEgIGRlbCBJbnN0aXR1dG8gZGUgRWNvbm9tw61hIEVuZXJnw6l0aWNhIChJREVFKSAtIEZ1bmRhY2nDs24gQmFyaWxvY2hlICAoMTk3MCAtIDE5ODgpLiBQcmVjaW8gb2ZpY2lhbCBpbnRlcm5vIGRlIGxhIGN1ZW5jYSBuZXVxdWluYSBhIHRhc2EgZGUgY2FtYmlvIG9maWNpYWwuIExhcyBmdWVudGVzIHV0aWxpemFkYXMgZGUgZXN0YSByZXZpc3RhIHNvbiBTZWNyZXRhcmlhIGRlIEVuZXJnw61hLCBZUEYsIEdhcyBkZWwgRXN0YWRvLCBCb2xldGluIEluZm9ybWF0aXZvIGRlIFRlY2hpbnQgeSBzZXJpZXMgcHJvcGlhcyBkZSBJREVFDQoqIE1lbW9yaWEgQW51YWwgeSBiYWxhbmNlcyBjb250YWJsZXMgZGUgWVBGICh2YXJpb3MgYcOxb3MpLiBQcmVjaW8gaW50ZXJvIHByb21lZGlvIHJlc3VsdGFudGUgZGUgbGEgcmVsYWNpw7NuIGVudHJlIHZlbnRhcyB5IGNhbnRpZGFkZXMgcHJvZHVjaWRhcy4NCg0KDQojIyMjICBQcmVjaW8gTWVyY2FkbyBJbnRlcm5vIGRlIENydWRvDQoNCiogQ3JpdGVyaW8gcGFyYSBwcmVjaW9fY3J1ZG86IA0KICArIDE5NjMgYSAxOTY1OiBLb3p1bGogeSBQaXN0b25lc2kgLSBSZXZpc3RhIElERUUgYWp1c3RhZG8gY29uIGVsIMOtbmRpY2UgZGVsIHByZWNpbyBkZWwgQW51YXJpbyBkZSBZUEYgDQogICsgMTk4OSBhIDE5OTE6IEFudWFyaW8gZGUgWVBGDQogICsgMTk2NiBhIDE5ODg6IEtvenVsaiB5IFBpc3RvbmVzaSAtIFJldmlzdGEgSURFRQ0KICArIDE5OTI6IE1FQ09OIGFqdXN0YWRvIGNvbiBsYSB2YXJpYWNpw7NuIGRlbCDDjW5kaWNlIGRlIHByZWNpb3MgaW50ZXJub3MgYWwgcG9yIG1heW9yIChJUElNKQ0KICArIDE5OTMgZW4gYWRlbGFudGU6IE1FQ09OIA0KIA0KYGBge3J9DQpwcmVjaW9fbWlfY3J1ZG8gPSByZWFkLmNzdigiLi4vcmVzdWx0YWRvcy9kYXRhX3Zpei9wcmVjaW9fbWlfY3J1ZG8uY3N2IikNCg0KZ2dwbG90bHkocHJlY2lvX21pX2NydWRvICU+JQ0KICAgICAgc2VsZWN0KC1wcmVjaW9fY3J1ZG9fbWRvaW50KSAlPiUNCiAgICAgIG11dGF0ZShyZWdhbGlhcyA9DQogICAgICAgICAgICAgICBjYXNlX3doZW4ocmVnYWxpYXMgPT0gMCB+IE5BX3JlYWxfLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gcmVnYWxpYXMpKSAlPiUNCiAgZ2F0aGVyKGtleSA9IHZhcmlhYmxlLCB2YWx1ZSA9IHZhbG9yLCA0Om5jb2woLikpICU+JQ0KICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IHZhcmlhYmxlLCBzaGFwZSA9IHZhcmlhYmxlKSkrDQogIGdlb21fbGluZShhbHBoYSA9IDAuOCkrDQogIGxhYnModGl0bGUgPSAiR3LDoWZpY28gMy4gUHJlY2lvcyBkZWwgbWVyY2FkbyBpbnRlcm5vIGRlbCBwZXRyw7NsZW8gY3J1ZG8uDQogICAgICAgQXJnZW50aW5hICgxOTYzIC0gMjAyMCkiLA0KICAgICAgIHkgPSAiVVNEL2JhcnJpbCIpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiksIHdpZHRoID0gODAwLCBoZWlnaHQgPSA2MDApDQoNCg0KYGBgDQoNCioqVGFibGEgMy4gUHJlY2lvIGRlbCBtZXJjYWRvIGludGVybm8gZGVsIHBldHLDs2xlbyBjcnVkbyBlbiBBcmdlbnRpbmEgc2Vnw7puIGRpc3RpbnRhcyBmdWVudGVzIChiYXJyaWxlcykqKg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnByZWNpb19taV9jcnVkbyAlPiUgDQogIHNlbGVjdCgtcHJlY2lvX2NydWRvX21kb2ludCkNCmBgYA0KDQoNCiMjIyMgUHJlY2lvIE1lcmNhZG8gSW50ZXJubyBkZSBHYXMgTmF0dXJhbA0KKiBQcmVjaW8gTWVyY2FkbyBJbnRlcm5vIGRlIGdhczoNCiAgKyAxOTYzIC0gMTk2OSAmIDE5ODkgLSAxOTkyOiBBbnVhcmlvIGRlIFlQRg0KICArIDE5NzAgLSAxOTg4OiAgS296dWxqIHkgUGlzdG9uZXNpIC0gUmV2aXN0YSBJREVFDQogICsgMTk5MyBlbiBhZGVsYW50ZTogU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEgLSBCYXNlIFJlZ2Fsw61hcw0KICANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQpwcmVjaW9fbWlfZ2FzX01NQlRVID0gcmVhZC5jc3YoIi4uL3Jlc3VsdGFkb3MvZGF0YV92aXovcHJlY2lvX21pX2dhcy5jc3YiKSANCmdncGxvdGx5KHByZWNpb19taV9nYXNfTU1CVFUgJT4lDQogICMgc2VsZWN0KC1jKGRpZl95cGZfaWRlZSwgcHJlY2lvX2dhc19tZG9pbnQpKSAlPiUNCiAgc2VsZWN0KC1jKCBwcmVjaW9fZ2FzX21kb2ludCkpICU+JQ0KICBnYXRoZXIoa2V5ID0gdGlwb19wcmVjaW8sDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgMzpuY29sKC4pKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gYW5pbywgeSA9IHZhbG9yLCBjb2xvciA9IHRpcG9fcHJlY2lvKSkrDQogIGdlb21fbGluZSgpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KICAjIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikrDQogIGxhYnModGl0bGUgPSAiR3LDoWZpY28gTsKwNC4gUHJlY2lvIGRlbCBtZXJjYWRvIGludGVybm8gZGVsIGdhcyBuYXR1cmFsLg0KICAgICAgIEFyZ2VudGluYSAoMTk2MyAtIDIwMTgpIiwNCiAgICAgICB5ID0gIlVTRC9NTUJUVSIpICAsIHdpZHRoID0gODAwLCBoZWlnaHQgPSA2MDApDQpgYGANCg0KDQo8YnI+DQoqKlRhYmxhIDQuIFByZWNpbyBkZWwgbWVyY2FkbyBpbnRlcm5vIGRlbCBnYXMgbmF0dXJhbCBlbiBBcmdlbnRpbmEgc2Vnw7puIGRpc3RpbnRhcyBmdWVudGVzIChiYXJyaWxlcykqKg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnByZWNpb19taV9nYXNfTU1CVFUgJT4lIA0KICBzZWxlY3QoLXByZWNpb19nYXNfbWRvaW50KQ0KYGBgDQogIA0KDQoNCiMjIFByZWNpb3MgZGUgUmVmZXJlbmNpYSBkZWwgTWVyY2FkbyBNdW5kaWFsDQpQcmVjaW9zIGRlIGV4cG9ydGFjacOzbiBkZXNkZSBBcmdlbnRpbmEsIGJlbmNobWFya3MgeSBQcmVjaW9zIGRlbCBtZXJjYWRvIGRlIEVFVVUgKHNvbG8gZ2FzLCBpbnRlcm5vcyB5IGRlIGV4cG8vaW1wbykNCg0KKiBbU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEtUmVnYWxpYXNdKGh0dHA6Ly9kYXRvcy5taW5lbS5nb2IuYXIvZGF0YXNldC9yZWdhbGlhcy1kZS1wZXRyb2xlby1jcnVkby1nYXMtbmF0dXJhbC1nbHAtZ2Fzb2xpbmEteS1jb25kZW5zYWRvKSkgKDIwMDYtaG95KQ0KKiBbTUVDT05dKGh0dHA6Ly9kYXRvcy5taW5lbS5nb2IuYXIvZGF0YXNldC9wcmVjaW8tZGUtZXhwb3J0YWNpb24tZGUtcGV0cm9sZW8tY3J1ZG8pLiBTZXJpZSBjb3J0YSB5IHNpbiB0cmFuc2Zvcm1hY2lvbmVzDQoqIEVJQQ0KICArIFtCcmVudF0oaHR0cHM6Ly93d3cuZWlhLmdvdi9kbmF2L3BldC9oaXN0L1JCUlRFRC5odG0pICgxOTg3LWhveSkNCiAgKyBbV1RJXShodHRwczovL3d3dy5laWEuZ292L2RuYXYvcGV0L2hpc3Qvcnd0Y0QuaHRtKSAoMTk4Ni1ob3kpDQogICsgW0hlbnJ5IEh1Yl0oaHR0cHM6Ly93d3cuZWlhLmdvdi9kbmF2L25nL2hpc3Qvcm5nd2hoZGQuaHRtKSAoMTk5Ny1ob3kpDQogICsgW1ByZWNpbyBHYXMgZGUgQm9jYSBkZSBQb3pvIGVuIEVFVVVdKGh0dHBzOi8vd3d3LmVpYS5nb3YvZG5hdi9uZy9oaXN0L245MTkwdXMzQS5odG0pDQoqIFtJbmZsYXRpb24gRGF0YV0oaHR0cHM6Ly9pbmZsYXRpb25kYXRhLmNvbS9hcnRpY2xlcy9pbmZsYXRpb24tYWRqdXN0ZWQtcHJpY2VzL2hpc3RvcmljYWwtY3J1ZGUtb2lsLXByaWNlcy10YWJsZS8pICgxOTQ2LWhveSkNCiogW0V1cm9zdGF0XShodHRwczovL2VjLmV1cm9wYS5ldS9ldXJvc3RhdC93ZWIvZW5lcmd5L2RhdGEvZGF0YWJhc2UpDQoqIFJldmlzdGEgSURFRSAgIA0KICArIFByZWNpbyBkZSBJbXBvcnRhY2nDs24gZGUgZ2FzIG5hdHVyYWwgZGVzZGUgQm9saXZpYSAoMTk3MC0xOTg4KQ0KKiBbVU4gQ29tdHJhZGVdKGh0dHBzOi8vY29tdHJhZGUudW4ub3JnL2RhdGEvKQ0KICArIFByZWNpbyBkZSBFeHBvcnRhY2nDs24gZSBJbXBvcnRhY2nDs24gZGUgZ2FzIHkgY3J1ZG8gKGEgQm9saXZpYSB5IHByb21lZGlvIG11bmRpYWwpDQogICsgRWwgcHJlY2lvIGltcG8gYm9saXZpYSBkZSAgVU4gQ29tdHJhZGUgY2llcnJhLCBkYSB2YWxvcmVzIGNvaGVyZW50ZXMgcGVybyBubyBkZWJlcmlhLCBkYWRvIHF1ZSBsYSBjb252ZXJzacOzbiBkZWJlcmlhIHJlYWxpemFyc2UgbXVsdGlwbGljYW5kbyBlbCBwcmVjaW8gZW4gTW0zIHBvciAxMDAwIHkgYWjDrSByZWNpw6luIHJlYWxpemFyIGxhIGNvbnZlcnNpw7NuDQogIA0KDQojIyMjIFByZWNpb3MgZGUgUmVmZXJlbmNpYSBkZWwgQ3J1ZG8NCiogRnVlbnRlcyBzZWxlY2Npb25hZGFzIHBhcmEgcHJlY2lvX21lX2NydWRvOiANCiAgKyBlbnRyZSAxOTYyIHkgMTk5MjogcHJlY2lvIGRlIGV4cG9ydGFjacOzbiBhcmdlbnRpbmEgZGUgVU4gQ29tdHJhZGUgKGNsYXNpZmljYWNpw7NuIFNJVEMgYXMgcmVwb3J0ZWQpDQogICsgZW50cmUgMTk5My0yMDAxIHkgMjAwNC0yMDE0OiBwcmVjaW8gZGUgZXhwb3J0YWNpw7NuIGFyZ2VudGluYSBkZSBNZWNvbg0KICArIGVudHJlIDIwMDIgeSAyMDAzOiBwcmVjaW8gZGUgZXhwb3J0YWNpw7NuIGRlIEFyZ2VudGluYSBkZSBVTiBDb210cmFkZSAoQ2xhc2lmaWNhY2nDs24gSFMgYXMgcmVwb3J0ZWQpDQogICsgMjAxNCBlbiBhZGVsYW50ZTogcHJlY2lvIGRlIGV4cG9ydGFjacOzbiBhcmdlbnRpbmEgZGUgU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEgKFJlZ2Fsw61hcykNCiAgKyBWYWxvcmVzIGZhbHRhbnRlcyBwcmV2aW9zIGEgMTk5MiAoMTk3MCAtIDE5ODUpOiBCcmVudCAoRnVlbnRlOiBJbmZsYXRpb24gRGF0YSkNCiAgDQogIA0KYGBge3J9DQpwcmVjaW9zX3JlZmVyZW5jaWFfeV9leHBvX2NydWRvID0gcmVhZC5jc3YoIi4uL3Jlc3VsdGFkb3MvcHJlY2lvX2V4cG9feV9tZG9fbXVuZGlhbF9jcnVkby5jc3YiKQ0KZ2dwbG90bHkocHJlY2lvc19yZWZlcmVuY2lhX3lfZXhwb19jcnVkbyAlPiUNCiAgc2VsZWN0KC1jKCIuLi4xIiwgcHJlY2lvX21lX2NydWRvKSkgJT4lDQogIGdhdGhlcihrZXkgPSB0aXBvX3ByZWNpbywNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICAzOm5jb2woLikpICU+JQ0KICAjIGZpbHRlcighKHRpcG9fcHJlY2lvICVpbiUgYygicHJlY2lvX2dhc19ib2xpdmlhX3VzZF9pZGVlIiwgInByZWNpb19pbXBvX2dhc19ib2xpdmlhX01NQlRVX2NvbXRyYWRlIiwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByZWNpb19leHBvX2dhc19jb210cmFkZSIsICJwcmVjaW9fZXhwb19nYXNfaW5kZWMiKSkpICU+JQ0KICAjIGZpbHRlcihhbmlvICE9IDIwMDIgJiB0aXBvX3ByZWNpbyAhPSAicHJlY2lvX2V4cG9fY3J1ZG9faW5kZWMiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gYW5pbywgeSA9IHZhbG9yLCBjb2xvciA9IHRpcG9fcHJlY2lvKSkrDQogIGdlb21fbGluZShhbHBoYSA9IDAuOSkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogIGxhYnModGl0bGUgPSAiUHJlY2lvcyBkZSBleHBvcnRhY2nDs24geSByZWZlcmVuY2lhIGRlbCBtZXJjYWRvIG11bmRpYWwgZGVsIGNydWRvIiwNCiAgICAgICB5ID0gIlVTRC9iYXJyaWxlcyIpICwgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCg0KYGBgDQogIA0KDQogIA0KICANCiMjIERpZmVyZW5jaWFsIGRlIHByZWNpb3MgIA0KYGBge3J9DQojIHZpc3VhbGl6YWNpb24gZGlmZXJlbmNpYWwgZGUgcHJlY2lvIG1kbyBpbnRlcm5vDQpwcmVjaW9fY3J1ZG9fbWRvaW50IDwtIHJlYWR4bDo6cmVhZF9leGNlbCgiLi4vcmVzdWx0YWRvcy9hcmdlbnRpbmEvcmVudGFfZGVfbGFfdGllcnJhX2hpZHJvY2FyYnVyaWZlcmFfYXJnLnhsc3giLCBzaGVldD0gInByZWNpb19pbnRlcm5vX2NydWRvIikNCg0KcHJlY2lvX2NydWRvX21kb2V4dCA8LSByZWFkeGw6OnJlYWRfZXhjZWwoIi4uL3Jlc3VsdGFkb3MvYXJnZW50aW5hL3JlbnRhX2RlX2xhX3RpZXJyYV9oaWRyb2NhcmJ1cmlmZXJhX2FyZy54bHN4Iiwgc2hlZXQ9ICJwcmVjaW9zX2V4dGVybm9fY3J1ZG8iKQ0KDQojIHByZWNpb19jcnVkb19tZG9pbnQgJT4lIA0KIyAgIHNlbGVjdChhbmlvLCBwcmVjaW9fY3J1ZG9fbWRvaW50KSAlPiUgDQojICAgbGVmdF9qb2luKHByZWNpb19jcnVkb19tZG9leHQgJT4lIA0KIyAgICAgICAgICAgICAgIHNlbGVjdChhbmlvLHByZWNpb19tZV9jcnVkbywgIHd0aV9laWEgLGJyZW50X2llYSANCiMgICAgICAgICAgICAgICAgICAgICAgKSwgYnkgPSAiYW5pbyIpICU+JSANCiMgICAjIHNlbGVjdCgtcHJlY2lvX2NydWRvX21kb2ludCkgJT4lDQojICAgcmVzaGFwZTI6Om1lbHQoLiwgaWQudmFycz0iYW5pbyIpICU+JSANCiMgICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbHVlLCBjb2xvciA9IHZhcmlhYmxlKSkrDQojICAgZ2VvbV9saW5lKCkrDQojICAgbGFicyh0aXRsZSA9ICJQcmVjaW8gZGUgdmVudGEgYWwgbWVyY2FkbyBpbnRlcm5vLCBleHBvcnRhY2lvbiB5IHJlZmVyZW5jaWFzIGRlbCBwZXRyw7NsZW8gY3J1ZG8iLA0KIyAgICAgICAgeCA9ICJBw7FvIiwgeSA9ICJVU0QvYmFycmlsIiwgY2FwdGlvbiA9ICJGdWVudGU6IHZlciBhbmV4byBtZXRvZG9sw7NnaWNvIikrDQojICAgIyB0aGVtZV9idygpKw0KIyAgIHRoZW1lX2xpZ2h0KCkrDQojICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KIyAgIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBwcmV0dHkocHJlY2lvX2NydWRvX21kb2ludCRhbmlvLCBuID0gMTApKSANCiMgDQojIGdnc2F2ZSgiLi4vcmVzdWx0YWRvcy9hcmdlbnRpbmEvcHJlY2lvX2ludGVybm9fdnNfZXh0ZXJuby5qcGciKQ0KYGBgDQoNCiMjIyMgUHJlY2lvcyBkZSBSZWZlcmVuY2lhIGRlbCBHYXMNCg0KKiBDcml0ZXJpbyBkZSBwcmVjaW9fZXh0ZXJub19nYXM6DQogICsgQcOxb3MgMTk2NCB5IDE5NjU6IFByZWNpbyBkZSBpbXBvcnRhY2nDs24gZGUgZ2FzIHByb3ZlbmllbnRlIGRlIEJvbGl2aWEgaGFjaWEgQXJnZW50aW5hIGRlIFVOIENvbXRyYWRlDQogICsgMTk2NiBlbiBhZGVsYW50ZTogUHJlY2lvIGRlIGV4cG9ydGFjaW9uIGRlIGdhcyBkZXNkZSBCb2xpdmlhIGEgQXJnZW50aW5hIGRlIFVOIENvbXRyYWRlDQogICsgRGF0b3MgZmFsdGFudGVzIHBhcmEgbG9zIGHDsW9zIHByZXZpb3MgYSAxOTYzIHkgcGVyw61vZG8gMTk2OC0xOTcxDQogIA0KYGBge3J9DQpwcmVjaW9fbWRvbXVuZGlhbF9nYXNfTU1CVFUgPSByZWFkLmNzdigiLi4vcmVzdWx0YWRvcy9kYXRhX3Zpei9wcmVjaW9fbWRvbXVuZGlhbF9nYXNfTU1CVFUuY3N2IikNCmdyYWZfcHJlY2lvX21kb19tdW5kaWFsX2dhc19tbWJ0dSA8LSBwcmVjaW9fbWRvbXVuZGlhbF9nYXNfTU1CVFUgJT4lDQogIGZpbHRlcihwcmVjaW9fZXh0ZXJub19nYXMgPCAyNSkgJT4lDQogIGdhdGhlcihrZXkgPSB0aXBvX3ByZWNpbywNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICAzOm5jb2woLikpICU+JQ0KICBmaWx0ZXIoDQogICAgdmFsb3IgPCAyNSwNCiAgICAhKHRpcG9fcHJlY2lvICVpbiUgYygiYnBfb2lsX21peF9tZWFuX29lY2QiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICwgInByZWNpb19leHBvX2dhc19pbmRlYyINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgInByZWNpb19nYXNfYm9saXZpYV91c2RfaWRlZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICJwcmVjaW9faW1wb19nYXNfYXJnX2JvbGl2aWFfY29tdHJhZGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAicHJlY2lvX2V4cG9fZ2FzX2NvbXRyYWRlIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkpICU+JQ0KICAjIGZpbHRlcighKHRpcG9fcHJlY2lvICVpbiUgYygicHJlY2lvX2V4cG9fZ2FzX2luZGVjIikpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gYW5pbywgeSA9IHZhbG9yLCBjb2xvciA9IHRpcG9fcHJlY2lvKSkrDQogIGdlb21fbGluZSgpICsNCiAgIyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpKw0KICBsYWJzKHRpdGxlID0gIlByZWNpb3MgZGUgZXhwb3J0YWNpw7NuIHkgcmVmZXJlbmNpYSBkZWwgbWVyY2FkbyBtdW5kaWFsIGRlbCBnYXMiLA0KICAgICAgIHkgPSAiVVNEL01NQlRVIikNCmdncGxvdGx5KGdyYWZfcHJlY2lvX21kb19tdW5kaWFsX2dhc19tbWJ0dSwgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCmBgYA0KIyMgRXhwb3J0YWNpb25lcyBlIEltcG9ydGFjaW9uZXMNCg0KKiBGdWVudGVzDQogICsgW1NFU0NPIERvd25zdHJlYW1dKGh0dHBzOi8vZGF0b3MuZ29iLmFyL2RhdGFzZXQvZW5lcmdpYS1yZWZpbmFjaW9uLWNvbWVyY2lhbGl6YWNpb24tcGV0cm9sZW8tZ2FzLWRlcml2YWRvcy10YWJsYXMtZGluYW1pY2FzKQ0KICArIElOREVDDQogICsgTUVDT04NCiAgKyBVTkNvbXRyYWRlDQoNCiMjIyMgRXhwb3J0YWNpb25lcyBlIEltcG9ydGFjaW9uZXMgZGUgQ3J1ZG8NCiogRXhwb3J0YWNpb25lcyBkZSBDcnVkbzogDQogICsgMTk2MiBhIDE5OTM6IFVOIENvbXRyYWRlDQogICsgMTk5NCBlbiBhZGVsYW50ZTogU0VTQ08gRG93bnN0cmVhbQ0KICArIExvcyBkYXRvcyBmYWx0YW50ZXMgZGUgU0VTQ08gc2UgY29tcGxldGFyb24gY29uIE1FQ09ODQogICsgU2lndWVuIGhhYmllbmRvIGRhdG9zIGZhbHRhbnRlcyBwYXJhIGxvcyBhw7FvcyAxOTY1LCAxOTcwLTc0LCAxOTc2LTc4LCAxOTgwLTg0DQogIA0KYGBge3J9DQoNCmV4cG9fdXNkX2NydWRvID0gcmVhZC5jc3YoIi4uL3Jlc3VsdGFkb3MvZGF0YV92aXovZXhwb191c2RfY3J1ZG8uY3N2IikNCmV4cG9fcV9jcnVkbyA9IHJlYWQuY3N2KCIuLi9yZXN1bHRhZG9zL2RhdGFfdml6L2V4cG9fcV9jcnVkby5jc3YiKQ0KDQpleHBvX3FfY3J1ZG8gJT4lDQogIHNlbGVjdCgtZXhwb19jcnVkbykgJT4lDQogIGdhdGhlcihrZXkgPSBmdWVudGUsIHZhbHVlID0gdmFsb3IgLCAzOm5jb2woLikpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBhbmlvLCB5ID0gdmFsb3IsIGNvbG9yID1mdWVudGUgKSkrDQogIGdlb21fbGluZSgpDQoNCmV4cG9fdXNkX2NydWRvICU+JQ0KICBzZWxlY3QoLWV4cG9fY3J1ZG8pICU+JQ0KICBnYXRoZXIoa2V5ID0gZnVlbnRlLCB2YWx1ZSA9IHZhbG9yICwgMzpuY29sKC4pKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gYW5pbywgeSA9IHZhbG9yLCBjb2xvciA9ZnVlbnRlICkpKw0KICBnZW9tX2xpbmUoKQ0KYGBgDQoNCiMjIyMgRXhwb3J0YWNpb25lcyBlIEltcG9ydGFjaW9uZXMgZGUgR2FzDQoqIEZ1ZW50ZXMgc2VsZWNjaW9uYWRhczoNCiArIDE5NjIgYSAxOTk2OiBVTiBDb210cmFkZSwNCiArIDE5OTcgZW4gYWRlbGFudGU6IFNFU0NPIERvd25zdHJlYW0NCiArIERhdG9zIGZhbHRhbnRlcyBwYXJhIGxvcyBhw7FvcyAxOTk5IHkgMjAwMA0KYGBge3J9DQoNCmV4cG9fdXNkX2dhcyA9IHJlYWQuY3N2KCIuLi9yZXN1bHRhZG9zL2RhdGFfdml6L2V4cG9fdXNkX2dhcy5jc3YiKQ0KZXhwb19xX2dhcyA9IHJlYWQuY3N2KCIuLi9yZXN1bHRhZG9zL2RhdGFfdml6L2V4cG9fcV9nYXMuY3N2IikNCg0KZXhwb19xX2dhcyAlPiUNCiAgc2VsZWN0KC1leHBvX2dhcykgJT4lDQogIGdhdGhlcihrZXkgPSBmdWVudGUsIHZhbHVlID0gdmFsb3IgLCAzOm5jb2woLikpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBhbmlvLCB5ID0gdmFsb3IsIGNvbG9yID1mdWVudGUgKSkrDQogIGdlb21fbGluZSgpDQoNCmV4cG9fdXNkX2dhcyAlPiUNCiAgICBzZWxlY3QoLWV4cG9fZ2FzKSAlPiUNCiAgZ2F0aGVyKGtleSA9IGZ1ZW50ZSwgdmFsdWUgPSB2YWxvciAsIDM6bmNvbCguKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IGFuaW8sIHkgPSB2YWxvciwgY29sb3IgPWZ1ZW50ZSApKSsNCiAgZ2VvbV9saW5lKCkNCg0KDQpgYGANCg0KDQojIyBFbXBsZW8sIFJlbXVuZXJhY2lvbmVzIHkgTWFzYSBTYWxhcmlhbCAoQ0NOTikNCg0KKiBTYWxhcmlvIHkgZW1wbGVvDQogICsgTVRFeVNTIChCYXNlIE1pbmVyw61hIGUgSGlkcm9jYXJidXJvcyBkZSBsYXMgQ3VlbnRhcyBOYWNpb25hbGVzKSAoMTk5Ni0yMDEzKQ0KICArIFtNaW5pc3RlcmlvIGRlIFRyYWJham8sIEVtcGxlbyB5IFNlZ3VyaWRhZCBTb2NpYWwgLSBPYnNlcnZhdG9yaW8gZGUgRW1wbGVvIHkgRGluw6FtaWNhIEVtcHJlc2FyaWFsIChPRURFKV0oaHR0cDovL3d3dy50cmFiYWpvLmdvYi5hci9lc3RhZGlzdGljYXMvb2VkZS9lc3RhZGlzdGljYXNuYWNpb25hbGVzLmFzcCkgKDE5OTYtMjAxOSkNCiAgKyBFUEggPz8NCjxicj4NCg0KDQojIFZhbG9yIHRvdGFsIGRlIGxhIHByb2R1Y2Npw7NuICANCg0KDQojIyBDcml0ZXJpb3MgbWV0b2RvbMOzZ2ljb3MgDQpTZSBwcmVzZW50YW4gYSBjb250aW51YWNpw7NuIGRpc3RpbnRhcyBlc3RpbWFjaW9uZXMgc29icmUgbGEgbWFnbml0dWQgZGUgcmlxdWV6YSBwcmVzZW50ZSBlbiBlbCBzZWN0b3IgaGlkcm9jYXJidXLDrWZlcm86IFZhbG9yIEJydXRvIHkgQWdyZWdhZG8gZGUgUHJvZHVjY2nDs24gKFZCUCB5IFZBKSwgQ29uc3VtbyBJbnRlcmVtZWRpbyAoQ0kpLCBNYXNhIFNhbGFyaWFsIChNUykgeSBFeGNlZGVudGUgQnJ1dG8gZGUgRXhwbG90YWNpw7NuIChFQkUpLiBFbCBWQlAgc3VyZ2UgZGUgbGEgdmFsdWFjacOzbiBkZSBsYSBwcm9kdWNjacOzbiBhIHN1cyBwcmVjaW9zIGNvcnJlc3BvbmRpZW50ZXMuIEVsIFZBIHJlc3VsdGEgZGUgbGEgZGlmZXJlbmNpYSBlbnRyZSBlbCBWQlAgeSBDSSwgZWwgY3VhbCBwdWVkZSBzdXJnaXIgb3JpZ2luYWxtZW50ZSBkZSBlc3RhIHJlc3RhIG8gYSBwYXJ0aXIgZGVsIGNvZWZpY2llbnRlIHTDqWNuaWNvIGRlIGxhIE1hdHJpeiBJbnN1bW8gUHJvZHVjdG8gKE1JUCkuIEVsIEVCRSBjb25zdGl0dXllIGxhIHBsdXN2YWzDrWEgKFBWKSB0b3RhbCBkZSBsYSByYW1hLCBlcyBkZWNpciwgbGEgc3VtYSBkZSBsYSByZW50YSBkZSBsYSB0aWVycmEgKFJUKSBtw6FzIGxhIGdhbmFuY2lhIG5vcm1hbCAoR25vcm0pLCB5IHNlIG9idGllbmUgbHVlZ28gZGUgZGVzY29udGFyIGxhIE1TIHkgbG9zIGltcHVlc3RvcyBlc3BlY8OtZmljb3MgKEltcCkgZGVsIFZBLiBFbiB0b2RvcyBsb3MgY2Fzb3MgcXVlIHNlIHByZXNlbnRhcsOhbiBhIGNvbnRpbnVhY2nDs24sIGxvcyBJbXAgc2UgY2FsY3VsYXJvbiBhIHBhcnRpciBkZSBhcGxpY2FyIHNvYnJlIGVsIFZCUCB1biBjb2VmaWNpZW50ZSAgcmVzdWx0YW50ZSBkZWwgcGVzbyBkZSBsb3MgaW1wdWVzdG9zIHByb21lZGlvIGRlIGxhICBNSVAgZGUgMTk5Ny4gTG8gbWlzbW8gcGFzYSBjb24gbGEgZXN0aW1hY2nDs24gZGUgbGEgZGVwcmVjaWFjacOzbiBkZSBjYXBpdGFsIG8gY29uc3VtbyBkZSBjYXBpdGFsIGZpam8gKENvbnNLZmlqbyksIHF1ZSBzZSBvYnRpZW5lIGEgcGFydGlyIGRlIGFwbGljYXIgbGEgdGFzYSBkZSBkZXByZWNpYWNpw7NuIHByb21lZGlvIHJlc3VsdGFudGUgZGUgbG9zIGJhbGFuY2VzIGRlIFlQRiAoMTk5OCAtIDIwMTgpIHNvYnJlIGVsIHRvdGFsIGRlIFByb3BpZWRhZCwgUGxhbnRhIHkgRXF1aXBvIChQUHlFKSBkZSBsYSByYW1hLiBFc3RhIHBhcnRpZGEgc2UgYXBsaWNhIHBhcmEgb2J0ZW5lciBlbCBFeGNlZGVudGUgTmV0byBkZSBFeHBsb3RhY2nDs24uIFNlIHByZXNlbnRhbiBkaXN0aW50YXMgZXN0aW1hY2lvbmVzIHBhcmEgZWwgVkJQLCBDSSB5IE1TLCBxdWUgbHVlZ28gc2Ugb2JzZXJ2YXLDoW4gZW4gbGEgZm9ybXVsYWNpw7NuIG1hdGVtw6F0aWNhOg0KDQoNCg0KKiBDQ05OICgqY2Nubl9vZmljaWFsKikNCiAgKyBWYWxvcmVzIGNvbnRhYmxlcyBvZmljaWFsZXMgZGUgbGFzIEN1ZW50YXMgTmFjaW9uYWxlcyAoc8OzbG8gZGlzcG9uaWJsZSBwYXJhIGVsIHBlcsOtb2RvIDIwMDQtMjAxMikuIERhZG8gcXVlIHNlIHByZXNlbnRhbiBzZXJpZXMgZGUgVkJQIHkgVkEsIHNlIHB1ZG8gZXN0aW1hciBlbCBDSSBjb21vIGxhIGRpZmVyZW5jaWEgZGUgZGljaGFzIGN1ZW50YXMuIFNlIHByb2NlZGnDsyBhIHNlcGFyYXIgZWwgVkJQIGEgcGFydGlyIGRlbCBwZXNvIGRlbCBWQlAgZGUgbG9zIHNlcnZpY2lvcyBkZSBhcG95byBhIGxhIGV4dHJhY2Npw7NuIHNvYnJlIGVsIFZCUCBkZSBleHRyYWNjacOzbiBkZSBwZXRyw7NsZW8geSBnYXMsIHByZXNlbnRlIGVuIGVsIEN1YWRybyBkZSBVdGlsaXphY2nDs24gZGUgT2ZlcnRhIChDT1UpIGRlIDIwMDQgZGUgSU5ERUMuIFNlIGRlc2NvbnTDsyBlc3RhIHByb3BvcmNpw7NuIChyZXN1bHRhbnRlIGRlbCAxMCw3JSkgZGVsIFZCUCB0b3RhbCBwYXJhIG9idGVuZXIgdW4gVkJQIHPDs2xvIGRlIGV4dHJhY2Npw7NuLiBEYWRvIHF1ZSBzZSBwb3NlZSBpbmZvcm1hY2nDs24gZGVsIHNhbGFyaW8gcHJvbWVkaW8gZGVsIHNlY3RvciB5IGVsIGVtcGxlbywgc2UgcHVkbyBvYnRlbmVyIGxhIE1TIHJlc3VsdGFudGUsIHRhbnRvIHBhcmEgZWwgdG90YWwgZGVsIHNlY3RvciAoZXh0cmFjY2nDs24geSBzZXJ2aWNpb3MgcmVsYWNpb25hZG9zKSBjb21vIHBhcmEgc8OzbG8gZXh0cmFjY2nDs24uIEEgcGFydGlyIGRlIGVzdG9zIGRhdG9zIHNlIGVsYWJvcsOzIHVuIGNvZWZpY2llbnRlIHF1ZSByZWZsZWphIGVsIHByb21lZGlvIGRlIGxhIHByb3BvcmNpw7NuIGRlIGxhIE1TIHNvYnJlIGVsIFZCUCBxdWUgc2UgdXRpbGl6YXLDoSBlbiBjw6FsY3Vsb3MgcG9zdGVyaW9yZXMgZGUgTVMgdG90YWwgeSBNUyBkZSBleHRyYWNjacOzbi4gDQoNCiogRXN0aW1hY2nDs24gcHJvcGlhIGNvbiBjcml0ZXJpbyBDQ05OICgqdmJwX3ZhX2NpX3Byb3BpYSopDQogICsgRXN0aW1hY2nDs24gcHJvcGlhIGRlIGxvcyB2YWxvcmVzIGNvbnRhYmxlcyBhIHBhcnRpciBkZSBsYXMgZnVlbnRlcyByZWNvcGlsYWRhcywgc2lndWllbmRvIGxvcyBjcml0ZXJpb3MgZGUgbGFzIEN1ZW50YXMgTmFjaW9uYWxlcy4gRXMgZGVjaXIsIHBhcmEgb2J0ZW5lciBlbCBWQlAgc2UgdmFsdWEgbGEgcHJvZHVjY2nDs24gZGVzdGluYWRhIGFsIG1lcmNhZG8gaW50ZXJubyAocmVzdWx0YW50ZSBhIHBhcnRpciBkZSBsYSBkaWZlcmVuY2lhIGVudHJlIHByb2R1Y2Npw7NuIHkgZXhwb3J0YWNpb25lcykgY29uIGxvcyBwcmVjaW9zIGludGVybm9zIHkgbGFzIGV4cG9ydGFjaW9uZXMgY29uIGxvcyBwcmVjaW9zIGRlIGV4cG9ydGFjacOzbiwgdmFsdWFkb3MgdGlwbyBkZSBjYW1iaW8gY29tZXJjaWFsIChUQ0MpLiBTZSBwcm9jZWRpw7MgdGFtYmnDqW4gYSBzZXBhcmFyIGVsIFZCUCBkZSBleHRyYWNjacOzbiBuZXRvIGRlIGxvcyBzZXJ2aWNpb3MgdGFsIGNvbW8gc2UgZXhwbGljw7MgYW50ZXJpb3JtZW50ZS4gRWwgQ0kgc2UgZXN0aW3DsyBhIHBhcnRpciBkZSBhcGxpY2FyIGVsIGNvZWZpY2llbnRlIHTDqWNuaWNvIChyYXRpbyBDSS9WQlApIHJlc3VsdGFudGUgZGUgbGEgTUlQIGRlIDE5OTcgKGVxdWl2YWxlbnRlIGEgMC4yNzIpLiBEZSBpZ3VhbCBtYW5lcmEsIHBhcmEgY2FsY3VsYXIgbGEgbWFzYSBzYWxhcmlhbCBzZSBhcGxpY8OzIGVsIGNvZWZpY2llbnRlIGRlIE1TIG1lbmNpb25hZG8gYW50ZXJpb3JtZW50ZS4gRmluYWxtZW50ZSwgY29tbyBzZSBtZW5jaW9uw7MgYW50ZXJpb3JtZW50ZSwgZWwgVkEgZWwgRUJFIHNlIGNhbGN1bGFyb24gYSBwYXJ0aXIgZGUgbGFzIGRpZmVyZW5jaWFzIG1lbmNpb25hZGFzIGFudGVyaW9ybWVudGUuIA0KDQoqIEVtcGFsbWUgQ0NOTiAoKnZicF9jY25uKikNCiAgKyBFc3RpbWFjacOzbiBxdWUgdG9tYSBsb3MgdmFsb3JlcyBvZmljaWFsZXMgZGUgbGFzIGN1ZW50YXMgbmFjaW9uYWxlcyBwYXJhIGVsIHBlcsOtb2RvIGRvbmRlIHNlIHByZXNlbnRhbiBkYXRvcyAoMjAwNCAtMjAxMikgeSBxdWUgaW1wdXRhIGxvcyB2YWxvcmVzIGZhbHRhbnRlcyBwb3IgbWVkaW8gZGUgbGEgZXZvbHVjacOzbiBkZWwgw61uZGljZSBkZWwgVkJQIHByb3BpbyBjb24gY3JpdGVyaW8gQ0NOTiBleHBsaWNhZG8gYW50ZXJpb3JtZW50ZS4gQXNpbWlzbW8sIHNlIHV0aWxpemFyb24gbG9zIHZhbG9yZXMgb2ZpY2lhbGVzIGRlIGxhIE1TIGN1YW5kbyBzZSBlbmNvbnRyYWJhIGRpc3BvbmlibGUgZWwgZGF0byAoMTk5Ni0yMDE4KSwgbWllbnRyYXMgcXVlIHNlIHV0aWxpesOzIGVsIHZhbG9yIHByb3BpbyBlc3RpbWFkbyBjb24gY3JpdGVyaW8gZGUgbGFzIENDTk4gcGFyYSBsb3MgcmVzdGFudGVzIGHDsW9zLiANCiAgDQoqIENyaXRlcmlvIFByb3BpbyAoKnB2X2hpZHJvY2FyYnVyb3NfcHJvcGlhKikNCiAgKyBFc3RpbWFjacOzbiBwcm9waWEgcXVlIHJlZmxlamEgY29uIG1heW9yIHByZWNpc2nDs24gZWwgdmFsb3IgZGUgbGEgcmlxdWV6YSB0b3RhbCBwcmVzZW50ZSBlbiBlbCBzZWN0b3IuIEVsIFZCUCBzZSBvYnRpZW5lIGEgcGFyaXRyIGRlIHZhbHVhciBsYSB0b3RhbGlkYWQgZGUgbGEgcHJvZHVjY2nDs24gYSBsb3MgcHJlY2lvcyBleHRlcm5vcyBvIGRlIHJlZmVyZW5jaWEgaW50ZXJuYWNpb25hbCB5IGNvbiBlbCB0aXBvIGRlIGNhbWJpbyBkZSBwYXJpZGFkIChUQ1ApLCBxdWUgbWlkZSBsYSBjYXBhY2lkYWQgcmVhbCBkZSBjb21wcmEgZGUgbGEgbW9uZWRhIG5hY2lvbmFsLiBTaW4gZW1iYXJnbywgY29tbyBlbCBDSSBjb25zdGl0dXllIGludGVyY2FtYmlvcyBkZSBtZXJjYW5jw61hcyByZWFsaXphZGFzIGVuIGVsIMOhbWJpdG8gbmFjaW9uYWwsIGRpY2hhIHBhcnRpZGEgc2Ugb2J0aWVuZSBhIHBhcnRpciBkZSBsb3MgdmFsb3JlcyBvYnRlbmlkb3MgZW4gbGEgc2VyaWUgZGUgZW1wYWxtZSBDQ05OLiBEZSBpZ3VhbCBtYW5lcmEsIHNlIHV0aWxpesOzIGxhIE1TIHJlc3VsdGFudGUgZGUgZXN0YSDDumx0aW1hIGVzdGltYWNpw7NuLiANCg0KDQoNCg0KIyMgRm9ybXVsYWNpw7NuIG1hdGVtw6F0aWNhIGRlIGVzdGltYWNpb25lcw0KDQpWYWxvciBCcnV0byBkZSBQcm9kdWNjacOzbiB0b3RhbCwgZXN0aW1hY2nDs24gY29uIGNyaXRlcmlvIHByb3Bpbw0KJCRWQlBfe3Byb3BpYX0gPSAoUGV4dF97cGV0csOzbGVvfSAqIFFfe3BldHLDs2xlb30gKyBQZXh0X3tnYXN9ICogUV97Z2FzfSkgKiBUQ1AkJA0KDQpEb25kZTogDQoNCiogJFZCUF97cHJvcGlhfSQgPSBWYWxvciBCcnV0byBkZSBsYSBQcm9kdWNjacOzbiB0b3RhbCwgZXN0aW1hY2nDs24gcHJvcGlhDQoqICRQZXh0X3twZXRyw7NsZW99JCA9IFByZWNpbyBkZSBleHBvcnRhY2nDs24gbyByZWZlcmVuY2lhIGludGVybmFjaW9uYWwgZGVsIHBldHLDs2xlbyBjcnVkbyAoc2Vnw7puIGNvcnJlc3BvbmRhKQ0KKiAkUGV4dF97Z2FzfSQgPSBQcmVjaW8gZGUgZXhwb3J0YWNpw7NuIG8gcmVmZXJlbmNpYSBpbnRlcm5hY2lvbmFsIGRlbCBnYXMgbmF0dXJhbCAoc2Vnw7puIGNvcnJlc3BvbmRhKQ0KKiAkUV97cGV0csOzbGVvfSQgPSBDYW50aWRhZGVzIHByb2R1Y2lkYXMgdG90YWxlcyBkZSBwZXRyw7NsZW8gY3J1ZG8NCiogJFFfe2dhc30kID0gQ2FudGlkYWRlcyBwcm9kdWNpZGFzIHRvdGFsZXMgZGUgZ2FzIG5hdHVyYWwNCiogJFRDUCQgPSBUaXBvIGRlIENhbWJpbyBkZSBQYXJpZGFkDQoNCg0KVmFsb3IgQnJ1dG8gZGUgUHJvZHVjY2nDs24gdG90YWwsIGVzdGltYWNpw7NuIGNvbiBjcml0ZXJpbyBDQ05ODQokJFZCUF97Q0NOTn0gPSAoUGludF97cGV0csOzbGVvfSAqIFFNSW50X3twZXRyw7NsZW99ICsgUGV4dF97cGV0csOzbGVvfSAqIEV4cG9fe3BldHLDs2xlb30gKyBQaW50X3tnYXN9ICogUU1JbnRfe2dhc30gKyBQZXh0X3tnYXN9ICogRXhwb197Z2FzfSkqIFRDQyQkDQoNCkRvbmRlOg0KDQoqICRWQlBfe0NDTk59JCA9IFZhbG9yIEJydXRvIGRlIGxhIFByb2R1Y2Npw7NuIHRvdGFsLCAgZXN0aW1hY2nDs24gcHJvcGlhIGNvbiBjcml0ZXJpbyBkZSBsYXMgQ0NOTg0KKiAkUGludF97cGV0csOzbGVvfSQgPSBQcmVjaW8gbWVyY2FkbyBpbnRlcm5vIGRlbCBwZXRyw7NsZW8gY3J1ZG8NCiogJFBpbnRfe2dhc30kID0gUHJlY2lvIG1lcmNhZG8gaW50ZXJubyBkZWwgZ2FzIG5hdHVyYWwNCiogJFFNSW50X3twZXRyw7NsZW99JCA9IGNhbnRpZGFkZXMgdmVuZGlkYXMgYWwgbWVyY2FkbyBpbnRlcm5vIGRlIHBldHLDs2xlbyBjcnVkbw0KKiAkUU1JbnRfe2dhc30kID0gY2FudGlkYWRlcyB2ZW5kaWRhcyBhbCBtZXJjYWRvIGludGVybm8gZGVsIGdhcyBuYXR1cmFsDQoqICRFeHBvX3twZXRyw7NsZW99JCA9IGV4cG9ydGFjaW9uZXMgZGUgcGV0csOzbGVvIGNydWRvDQoqICRFeHBvX3tnYXN9JCA9IGV4cG9ydGFjaW9uZXMgZGUgZ2FzIG5hdHVyYWwNCiogJFRDQyQgPSBUaXBvIGRlIENhbWJpbyBDb21lcmNpYWwNCg0KDQo8YnI+DQoNClZhbG9yIEJydXRvIGRlIFByb2R1Y2Npw7NuIGV4dHJhY2Npw7NuLCBlc3RpbWFjacOzbiBjb24gY3JpdGVyaW8gQ0NOTg0KDQokJFZCUFxfZXh0cl97Q0NOTn0gPSBWQlBfe0NDTk59ICogKDEtcHJvcFxfc2VydmljaW9zKSQkDQoNCkRvbmRlOg0KDQoqICRWQlBcX2V4dHJfe0NDTk59JCA9IFZhbG9yIEJydXRvIGRlIGxhIFByb2R1Y2Npw7NuIGV4dHJhY2Npw7NuLCAgZXN0aW1hY2nDs24gcHJvcGlhIGNvbiBjcml0ZXJpbyBkZSBsYXMgQ0NOTg0KKiAkcHJvcFxfZXh0ciQgPSBwcm9wb3JjacOzbiBkZWwgVkJQIGRlIHNlcnZpY2lvcyBkZSBhcG95byBzb2JyZSBWQlAgZGUgZXh0cmFjY2nDs24gZGUgcGV0csOzbGVvIHkgZ2FzDQoNCg0KUHJvcG9yY2nDs24gZGUgbG9zIHNlcnZpY2lvcyBkZSBhcG95byBzb2JyZSBsYSBleHRyYWNjacOzbiBkZSBwZXRyw7NsZW8geSBnYXMNCjxicj4NCiQkcHJvcFxfc2VydmljaW9zID0gXGZyYWN7VkJQXF9zZXJ2aWNpb3Nfe0NPVX19e1ZCUFxfZXh0cl97Q09VfSArIFZCUFxfc2VydmljaW9zX3tDT1V9fSQkDQoNCkRvbmRlOg0KDQoqICRWQlBcX3NlcnZpY2lvc197Q09VfSQgPSBWQlAgZGUgc2VydmljaW9zIGRlIGFwb3lvIGRlbCBDdWFkcm8gZGUgVXRpbGl6YWNpw7NuIGRlIE9mZXJ0YQ0KKiAkVkJQXF9leHRyYWNjacOzbl97Q09VfSQgPSBWQlAgZGUgZXh0cmFjY2nDs24gZGUgcGV0csOzbGVvIHkgZ2FzIGRlbCBDdWFkcm8gZGUgVXRpbGl6YWNpw7NuIGRlIE9mZXJ0YQ0KDQoNCg0KPGJyPg0KQ29uc3VtbyBJbnRlcm1lZGlvLCB2YWxvcmVzIG9maWNpYWxlcyBkZSBsYXMgQ0NOTg0KJCQgQ0lfe0NDTk59ID0gVkJQX3tDQ05OfSAtICBWQV97Q0NOTn0gJCQNCg0KRG9uZGU6DQoNCiogJENJX3tDQ05OfSQgPSBDb25zdW1vIEludGVybWVkaW8gdG90YWwsIGVzdGltYWNpw7NuIHByb3BpYQ0KKiAkVkFfe0NDTk59JCA9IFZhbG9yIEFncmVnYWRvLCBlc3RpbWFjacOzbiBkZSBsYXMgQ0NOTiANCg0KPGJyPg0KQ29uc3VtbyBJbnRlcm1lZGlvLCBlc3RpbWFjacOzbiBjb24gY3JpdGVyaW8gQ0NOTg0KJCQgQ0lfe0NDTk59ID0gVkJQX3tDQ05OfSAqICBDb2VmXF90ZWMgJCQNCkRvbmRlOg0KDQoqICRDb2VmXF90ZWMkID0gQ29lZmljaWVudGUgdMOpY25pY28gZGUgTWF0cml6IEluc3VtbyBQcm9kdWN0bw0KDQo8YnI+DQpDb25zdW1vIEludGVybWVkaW8gZGUgZXh0cmFjY2nDs24sIGVzdGltYWNpw7NuIGNvbiBjcml0ZXJpbyBDQ05ODQoNCiQkIENJXF9leHRyX3tDQ05OfSA9IFZCUFxfZXh0cl97Q0NOTn0gKiAgQ29lZlxfdGVjICQkDQoNCkRvbmRlOg0KDQoqICQgQ0lcX2V4dHJfe0NDTk59JCA9IENvbnN1bW8gSW50ZXJtZWRpbyBkZSBleHRyYWNjacOzbiwgZXN0aW1hY2nDs24gY3JpdGVyaW8gQ0NOTg0KDQo8YnI+DQpNYXNhIFNhbGFyaWFsLCB2YWxvcmVzIG9maWNpYWxlcyBkZSBsYXMgQ0NOTg0KJCRNUyA9IFcgKiBFbXAgKiAxMyQkDQpEb25kZTogDQoNCiogJE1TJCA9IE1hc2EgU2FsYXJpYWwgDQoqICRXJCA9ICBTYWxhcmlvIGFudWFsIHByb21lZGlvDQoqICRFbXAkID0gRW1wbGVvDQoNCjxicj4NCk1hc2EgU2FsYXJpYWwsIGVzdGltYWNpw7NuIGNvbiBjcml0ZXJpbyBDQ05ODQokJE1TID0gIFZCUF97Q0NOTn0gKiAgQ29lZlxfTVMkJA0KDQpEb25kZTogDQoNCiogJENvZWZcX01TJCA9IENvZWZpY2llbnRlIGRlIGxhIHByb3BvcmNpw7NuIGRlIE1TIHNvYnJlIFZCUA0KDQo8YnI+DQpNYXNhIFNhbGFyaWFsIGRlIGV4dHJhY2Npw7NuLCBlc3RpbWFjacOzbiBjb24gY3JpdGVyaW8gQ0NOTg0KJCRNU1xfZXh0ciA9ICBWQlBcX2V4dHJfe0NDTk59ICogIENvZWZcX01TJCQNCg0KRG9uZGU6IA0KDQogICogJE1TXF9leHRyJCA9IE1hc2Egc2FsYXJpYWwgZGVsIHNlY3RvciBleHRyYWNjacOzbg0KDQo8YnI+DQpWYWxvciBhZ3JlZ2FkbywgZXN0aW1hY2nDs24gY3JpdGVyaW8gQ0NOTg0KJCRWQV97Q0NOTn0gID0gVkJQX3tDQ05OfSDigJMgQ0lfe0NDTk59ICQkDQpEb25kZToNCg0KKiAkVkFfe0NDTk59JCA9IFZhbG9yIEFncmVnYWRvLCBlc3RpbWFjacOzbiBwcm9waWEgY29uIGNyaXRlcmlvIENDTk4NCg0KPGJyPg0KVmFsb3IgYWdyZWdhZG8gZGUgZXh0cmFjY2nDs24sIGVzdGltYWNpw7NuIGNvbiBjcml0ZXJpbyBDQ05ODQokJFZBXF9leHRyX3tDQ05OfSAgPSBWQlBcX2V4dHJfe0NDTk59IOKAkyBDSVxfZXh0cl97Q0NOTn0gJCQNCg0KRG9uZGU6DQoNCiogJFZBXF9leHRyX3tDQ05OfSQgPSBWYWxvciBBZ3JlZ2FkbyBkZSBleHRyYWNjacOzbiwgZXN0aW1hY2nDs24gcHJvcGlhIGNvbiBjcml0ZXJpbyBDQ05OIA0KDQoNCjxicj4NClZhbG9yIGFncmVnYWRvLCBlc3RpbWFjacOzbiBjb24gY3JpdGVyaW8gcHJvcGlvDQokJFZBX3twcm9waWF9ICA9IFZCUF97cHJvcGlhfSDigJMgQ0lcX2V4dHJfe0NDTk59ICQkDQoNCkRvbmRlOg0KDQoqICRWQV97cHJvcGlhfSQgPSBWYWxvciBBZ3JlZ2FkbywgZXN0aW1hY2nDs24gY29uIGNyaXRlcmlvIHByb3BpbyANCg0KDQo8YnI+DQoNCkV4Y2VkZW50ZSBCcnV0byBkZSBFeHBsb3RhY2nDs24sIGVzdGltYWNpw7NuIGNvbiBjcml0ZXJpbyBDQ05ODQokJEVCRV97Q0NOTn0gID0gVkFfe0NDTk59IOKAkyBNUyAgICQkDQo8YnI+DQoNCkV4Y2VkZW50ZSBCcnV0byBkZSBFeHBsb3RhY2nDs24gZGUgZXh0cmFjY2nDs24sIGVzdGltYWNpw7NuIGNvbiBjcml0ZXJpbyBDQ05ODQokJEVCRVxfZXh0cl97Q0NOTn0gID0gVkFcX2V4dHJfe0NDTk59IOKAkyBNU1xfZXh0ciAgICQkDQoNCjxicj4NCg0KRXhjZWRlbnRlIEJydXRvIGRlIEV4cGxvdGFjacOzbiwgZXN0aW1hY2nDs24gY29uIGNyaXRlcmlvIHByb3Bpbw0KJCRFQkVfe3Byb3BpYX0gID0gVkFfe3Byb3BpYX0g4oCTIE1TXF9leHRyICAgJCQNCg0KDQpEb25kZToNCg0KKiAkRUJFJCA9IEV4Y2VkZW50ZSBCcnV0byBkZSBFeHBsb3RhY2nDs24NCiogJENJXF9leHRyX3tDQ05OfSQgPSBDb25zdW1vIGludGVybWVkaW8gZGVsIHNlY3RvciBleHRyYWNjacOzbiwgZXN0aW1hY2nDs24gY29uIGNyaXRlcmlvIENDTk4NCg0KDQo8YnI+DQpDb25zdW1vIGRlIENhcGl0YWwgRmlqbywgZXN0aW1hY2nDs24gY29uIGNyaXRlcmlvIHByb3Bpbw0KJCRDb25LZmlqbyA9IFBQeUUgKiAgcHJvbShcZnJhY3tEZXB9e1BQeUV9KSAkJA0KDQpEb25kZTogDQoNCiogJENvbktmaWpvJCA9IENvbnN1bW8gZGUgQ2FwaXRhbCBGaWpvDQoqICRQUHlFJD0gUHJvcGllZGFkLCBQbGFudGEgeSBFcXVpcG8gbmV0YQ0KKiAkcHJvbShcZnJhY3tEZXB9e1BQeUV9KSAkID0gIHRhc2EgZGUgZGVwcmVjaWFjacOzbiBwcm9tZWRpbw0KKiAkRGVwJCA9IERlcHJlY2lhY2lvbmVzIChjdWVudGEgZ2FzdG9zIHBvciBuYXR1cmFsZXphKQ0KDQo8YnI+DQoNClBsdXN2YWzDrWEgKEV4Y2VkZW50ZSBOZXRvIGRlIEV4cGxvdGFjacOzbiksIGVzdGltYWNpw7NuIGNvbiBjcml0ZXJpbyBwcm9waW8NCiQkUFZfe3Byb3BpYX0gPSBWQV97cHJvcGlhfSAtIENvbktmaWpvIC0gSW1wICQkDQoNCg0KRG9uZGU6DQoNCiogJFBWX3twcm9waWF9JCA9IFBsdXN2YWzDrWEgKCpFeGNlZGVudGUgTmV0byBkZSBFeHBsb3RhY2nDs24qKQ0KKiAkSW1wJCA9IEltcHVlc3RvcyBub3JtYWxlcw0KDQoNCg0KIyMgRnVlbnRlcyBwYXJhIGxhIGNvbnN0cnVjY2nDs24gZGUgc2VyaWVzIA0KDQoqIFByb2R1Y2Npw7NuIGRlIENydWRvOiANCiAgKyAxOTExIGEgMTk5MjogQW51YXJpbyBkZSBjb21idXN0aWJsZXMgDQogICsgMTk5MyAtIGFjdHVhbGlkYWQ6IFNFU0NPIERvd25zdHJlYW0NCiAgDQoqIEV4cG9ydGFjaW9uZXMgZGUgQ3J1ZG86IA0KICArIDE5NjIgYSAxOTkzOiBVTiBDb210cmFkZSAoY2xhc2lmaWNhY2nDs24gU0lUQyBhcyByZXBvcnRlZCkNCiAgKyAxOTk0IGVuIGFkZWxhbnRlOiBTRVNDTyBEb3duc3RyZWFtDQogICsgTG9zIGRhdG9zIGZhbHRhbnRlcyBkZSBTRVNDTyBzZSBjb21wbGV0YXJvbiBjb24gTUVDT04NCiAgKyBTaWd1ZW4gaGFiaWVuZG8gZGF0b3MgZmFsdGFudGVzIHBhcmEgbG9zIGHDsW9zIDE5NjUsIDE5NzAtNzQsIDE5NzYtNzgsIDE5ODAtODQNCiAgDQoqIFByZWNpbyBNZXJjYWRvIEludGVybm8gZGUgQ3J1ZG86IA0KICArIDE5NjMgYSAxOTY1OiBLb3p1bGogeSBQaXN0b25lc2kgLSBSZXZpc3RhIElERUUgYWp1c3RhZG8gY29uIGVsIMOtbmRpY2UgZGVsIHByZWNpbyBkZWwgQW51YXJpbyBkZSBZUEYgDQogICsgMTk4OSBhIDE5OTE6IEFudWFyaW8gZGUgWVBGDQogICsgMTk2NiBhIDE5ODg6IEtvenVsaiB5IFBpc3RvbmVzaSAtIFJldmlzdGEgSURFRQ0KICArIDE5OTI6IE1FQ09OIGFqdXN0YWRvIGNvbiBsYSB2YXJpYWNpw7NuIGRlbCDDjW5kaWNlIGRlIHByZWNpb3MgaW50ZXJub3MgYWwgcG9yIG1heW9yIChJUElNKQ0KICArIDE5OTMgZW4gYWRlbGFudGU6IE1FQ09OIA0KICANCiogUHJlY2lvIE1lcmNhZG8gRXh0ZXJubyBDcnVkbzoNCiAgKyBlbnRyZSAxOTYyIHkgMTk5MjogcHJlY2lvIGRlIGV4cG9ydGFjacOzbiBhcmdlbnRpbmEgZGUgVU4gQ29tdHJhZGUNCiAgKyBlbnRyZSAxOTkzLTIwMDEgeSAyMDA0LTIwMTQ6IHByZWNpbyBkZSBleHBvcnRhY2nDs24gYXJnZW50aW5hIGRlIE1lY29uDQogICsgZW50cmUgMjAwMiB5IDIwMDM6IHByZWNpbyBkZSBleHBvcnRhY2nDs24gZGUgQXJnZW50aW5hIGRlIFVOIENvbXRyYWRlIChDbGFzaWZpY2FjacOzbiBIUyBhcyByZXBvcnRlZCkgIA0KICArIDIwMTQgZW4gYWRlbGFudGU6IHByZWNpbyBkZSBleHBvcnRhY2nDs24gYXJnZW50aW5hIGRlIFNlY3JldGFyw61hIGRlIEVuZXJnw61hIChSZWdhbMOtYXMpDQogICsgVmFsb3JlcyBmYWx0YW50ZXMgcHJldmlvcyBhIDE5OTI6IEJyZW50ICAoRnVlbnRlOiBJbmZsYXRpb24gRGF0YSkNCiAgDQoqIFByb2R1Y2Npw7NuIGRlIEdhczoNCiAgKyAxOTExIGEgMTk5MjogQW51YXJpbyBkZSBjb21idXN0aWJsZXMgDQogICsgMTk5MyBlbiBhZGVsYW50ZTogU0VTQ08gRG93bnN0cmVhbQ0KICANCiogRXhwb3J0YWNpb25lcyBkZSBnYXM6IA0KICArIDE5NjIgYSAxOTk2OiBVTiBDb210cmFkZSwNCiAgKyAxOTk3IGVuIGFkZWxhbnRlOiBTRVNDTyBEb3duc3RyZWFtDQogICsgRGF0b3MgZmFsdGFudGVzIHBhcmEgbG9zIGHDsW9zIDE5OTkgeSAyMDAwDQogIA0KKiBQcmVjaW8gTWVyY2FkbyBJbnRlcm5vIGRlIGdhczoNCiAgKyAxOTYzIC0gMTk2OSAmIDE5ODkgLSAxOTkyOiBBbnVhcmlvIGRlIFlQRg0KICArIDE5NzAgLSAxOTg4OiAgS296dWxqIHkgUGlzdG9uZXNpIC0gUmV2aXN0YSBJREVFDQogICsgMTk5MyBlbiBhZGVsYW50ZTogU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEgLSBCYXNlIFJlZ2Fsw61hcw0KICArIEVsIGRhdG8gZGVsIGHDsW8gMTk5MiBzZSBkaXZpZGnDsyBwb3IgMTAsIGRhZG8gcXVlIHJlc3VsdGFiYSBleGNlc2l2YW1lbnRlIGFsdG8sIGxvIGN1YWwgZXMgbWV0b2RvbMOzZ2ljYW1lbnRlIGluYWNlcHRhYmxlIHBlcm8gc2lydmUgZGUgZWplcmNpY2lvLiANCiAgDQoqIFByZWNpbyBNZXJjYWRvIEV4dGVybm86DQogICsgQcOxb3MgMTk2NCB5IDE5NjU6IFByZWNpbyBkZSBpbXBvcnRhY2nDs24gZGUgZ2FzIHByb3ZlbmllbnRlIGRlIEJvbGl2aWEgaGFjaWEgQXJnZW50aW5hIGRlIFVOIENvbXRyYWRlDQogICsgMTk2NiBlbiBhZGVsYW50ZTogUHJlY2lvIGRlIGV4cG9ydGFjaW9uIGRlIGdhcyBkZXNkZSBCb2xpdmlhIGEgQXJnZW50aW5hIGRlIFVOIENvbXRyYWRlDQogICsgRGF0b3MgZmFsdGFudGVzIHBhcmEgbG9zIGHDsW9zIHByZXZpb3MgYSAxOTYzIHkgcGVyw61vZG8gMTk2OC0xOTcxIA0KDQoqIFZhbG9yIEJydXRvIGRlIGxhIFByb2R1Y2Npw7NuLCBWYWxvciBBZ3JlZ2FkbyB5IENvbnN1bW8gSW50ZXJtZWRpbzoNCiAgKyBJTkRFQyAtIERpcmVjY2nDs24gTmFjaW9uYWwgZGUgQ3VlbnRhcyBOYWNpb25hbGVzIChCYXNlIE1pbmVyw61hIGUgSGlkcm9jYXJidXJvcyBkZSBsYXMgQ3VlbnRhcyBOYWNpb25hbGVzKS4gTGFzIHZhcmlhYmxlcyAiZXh0cmFjY2lvbl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zIiByZWZpZXJlbiBhICJFeHRyYWNjacOzbiBkZSBwZXRyw7NsZW8gY3J1ZG8geSBnYXMgbmF0dXJhbC4gQWN0aXZpZGFkZXMgZGUgc2VydmljaW9zIHJlbGFjaW9uYWRhcyBjb24gbGEgZXh0cmFjY2nDs24gZGUgcGV0csOzbGVvIHkgZ2FzLCBleGNlcHRvIGxhcyBhY3RpdmlkYWRlcyBkZSBwcm9zcGVjY2nDs24iDQogICsgQ8OhbGN1bG8gcHJvcGlvIGRlbCBWQlAgY29uIGRhdG9zIGRhdG9zIGRlIHByb2R1Y2Npw7NuIHkgcHJlY2lvIGludGVybmFjaW9uYWwgcmVjb3BpbGFkb3MuIExhcyBmdWVudGVzIHNvbiBsYXMgc2lndWllbnRlcyAobG9zIGNyaXRlcmlvcyBzb24gbG9zIG1pc21vcyBwYXJhIGxhIHV0aWxpemFjacOzbiBwb3N0ZXJpb3IgZW4gZWwgY8OhbGN1bG8gZGUgcmVudGEgZGUgbGEgdGllcnJhIGhpZHJvY2FyYnVyw61mZXJhIHBvciBkaWZlcmVuY2lhbCBkZSBwcmVjaW9zLCBzb2JyZXZhbHVhY2nDs24gY2FtYmlhcmlhIHkgb3Ryb3MgbWVjYW5pc21vcykNCg0KKiBTYWxhcmlvIHkgZW1wbGVvDQogICsgMTk2MC0xOTk2OiBlc3RpbWFjacOzbiBhIHBhcnRpciBkZSBhcGxpY2FjacOzbiBkZWwgY29lZmljaWVudGUgZGUgcHJvcG9yY2nDs24gZGUgbGEgbWFzYSBzYWxhcmlhbCBzb2JyZSBlbCBWQlANCiAgKyAxOTk2IGVuIGFkZWxhbnRlOiBNaW5pc3RlcmlvIGRlIFRyYWJham8sIEVtcGxlbyB5IFNlZ3VyaWRhZCBTb2NpYWwgLSBPYnNlcnZhdG9yaW8gZGUgRW1wbGVvIHkgRGluw6FtaWNhIEVtcHJlc2FyaWFsIChPRURFKQ0KDQoqIENvbnN1bW8gZGUgY2FwaXRhbCBmaWpvDQogICsgQ29lZmljaWVudGUgZGUgZGVwcmVjaWFjacOzbiBlc3RpbWFkbyBhIHBhcnRpciBkZSBFc3RhZG9zIENvbnRhYmxlcyBkZSBZUEYgKDE5OTgtMjAxOCkNCjxicj4NCg0KDQoNCmBgYHtyfQ0KdmFsb3JfdG90YWxfcHJvZHVjY2lvbiA9IHJlYWQuY3N2KCIuLi9yZXN1bHRhZG9zL2RhdGFfdml6L3ZhbG9yX3RvdGFsX3Byb2R1Y2Npb24uY3N2IikNCmdyYWZfdmFsb3JfcHJvZHVjY2lvbiA8LSB2YWxvcl90b3RhbF9wcm9kdWNjaW9uICU+JQ0KICBmaWx0ZXIoYW5pbyA+IDE5NjApICU+JQ0KICBnZ3Bsb3QoIGFlcyhhbmlvLCB2YWxvciwgY29sb3IgPSBmdWVudGUpKSsNCiAgZ2VvbV9saW5lKGFscGhhID0gMC43KSsNCiAgZ2VvbV9wb2ludChzaXplID0gMC40MzUsIGFscGhhID0gMC4yKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogIGxhYnModGl0bGUgPSAiVmFsb3IgZGUgbGEgUHJvZHVjY2nDs24gaGlkcm9jYXJidXLDrWZlcmEiLA0KICAgICAgIHN1YnRpdGxlID0gIlZhbG9yIHRvdGFsIHkgY29tcG9uZW50ZXMiLA0KICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgcGVzb3MgZGUgMjAxOCIpKw0KICBmYWNldF93cmFwKH52YXJpYWJsZSkNCmdwIDwtIGdncGxvdGx5KGdyYWZfdmFsb3JfcHJvZHVjY2lvbiwgd2lkdGggPSA3NTAsIGhlaWdodCA9IDgwMCkNCmdwW1sneCddXVtbJ2xheW91dCddXVtbJ2Fubm90YXRpb25zJ11dW1syXV1bWyd4J11dIDwtIC0wLjExDQpncCAlPiUgbGF5b3V0KG1hcmdpbiA9IGxpc3QobCA9IDc1KSkNCg0KYGBgDQoNCg0KIyMjIEN1ZW50YXMgTmFjaW9uYWxlcw0KDQpbUHJvZHVjdG8gSW50ZXJubyBCcnV0byBFeHBsb3RhY2nDs24gTWluYXMgeSBDYW50ZXJhcyBNaWxsb25lcyBkZSBwZXNvcyBjb25zdGFudGVzLiBCYXNlIDE5NjAuIFZhbG9yZXMgdHJpbWVzdHJhbGVzDQpQSUIgRXhwbG90YWNpw7NuIE1pbmFzIHkgQ2FudGVyYXMgZW4gbWlsbG9uZXMgZGUgcGVzb3MgZGUgMTk2MC4gMTk3MC0xOTgwXShodHRwczovL2RhdG9zLmdvYi5hci9kYXRhc2V0L3NzcG0tcHJvZHVjdG8taW50ZXJuby1icnV0by1zZWN0b3JpYWwtMTk3MC0xOTgwKQ0KDQoNCltQcm9kdWN0byBJbnRlcm5vIEJydXRvIEV4cGxvdGFjacOzbiBNaW5hcyB5IENhbnRlcmFzLCBBdXN0cmFsZXMgY29uc3RhbnRlcy4gQmFzZSAxOTcwLlZhbG9yZXMgdHJpbWVzdHJhbGVzDQpQSUIgRXhwbG90YWNpw7NuIE1pbmFzIHkgQ2FudGVyYXMgZW4gYXVzdHJhbGVzIGEgcHJlY2lvcyBkZSAxOTcwLiAxOTgwLTE5OTBdKGh0dHBzOi8vZGF0b3MuZ29iLmFyL2RhdGFzZXQvc3NwbS1wcm9kdWN0by1pbnRlcm5vLWJydXRvLXNlY3RvcmlhbC0xOTgwLTE5OTApIA0KDQojIEludmVyc2lvbmVzDQoNCiMjIFNlYyBlbmVyZ2lhDQoNCiMjIEJhbGFuY2VzDQpgYGB7cn0NCg0KIyBQRU5TQVIgQUxHTyBBU0kgUEVSTyBNQVMgQUNFUFRBQkxFIA0KIyBncmFmX3N0b2NrX3JhbWEgPC0gc3RvY2tfcmFtYSAlPiUNCiMgICAjIG11dGF0ZSh2YWxvciA9IG51bWJlcl9mb3JtYXQodmFsb3IsIGJpZy5tYXJrID0gIiAiICkpICU+JQ0KIyAgIGZpbHRlcihzZWN0b3IgIT0gImRpc3RyaWJ1Y2lvbiIpICU+JQ0KIyAgIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gc2VjdG9yLCBzaGFwZSA9IGZ1ZW50ZSkpKw0KIyAgIGdlb21fbGluZSgpKw0KIyAgIGdlb21fcG9pbnQoc2l6ZSA9IC44KSsNCiMgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQojICAgbGFicyh0aXRsZSA9ICJTdG9jayBkZSBjYXBpdGFsIGFkZWxhbnRhZG8geSBhY3Rpdm8gZGUgc2VnbWVudG9zIiwNCiMgICAgICAgIHN1YnRpdGxlID0gIlN1YnNlY3RvcmVzIGRlbCBzZWN0b3IgaGlkcm9jYXJidXLDrWZlcm8iLA0KIyAgICAgICAgeSA9ICJNaWxsb25lcyBkZSBwZXNvcyBkZSAyMDE4IikrDQojICAgdGhlbWVfY2xhc3NpYygpKw0KIyAgIGZhY2V0X3dyYXAofiB2YXJpYWJsZSApDQojIA0KIyBnZ3Bsb3RseShncmFmX3N0b2NrX3JhbWEsIHdpZHRoID0gODAwLCBoZWlnaHQgPSA0MDApDQpgYGANCg0KDQojIFJlbnRhYmlsaWRhZA0KDQoNCiQkVEdfe2hpZHJvY2FyYnVyb3N9ID0gXGZyYWN7UFZfe2hpZHJvY2FyYnVyw61mZXJhfX17S1RBX3toaWRyb2NhcmJ1csOtZmVyb319JCQNCg0KRG9uZGU6DQoNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCiNsZXZhbnRvIGRhdGEgc2V0cyBkZSBvdHJvIFIgbWFya2Rvd24NCmJhbGFuY2VzX2FyZyA8LSByZWFkX2NzdigiLi4vZGF0YS9iYWxhbmNlcy9iYWxhbmNlc19hcmcuY3N2IiwgDQogICAgY29sX3R5cGVzID0gY29scyhmZWNoYSA9IGNvbF9kYXRlKGZvcm1hdCA9ICIlWS0lbS0lZCIpLCBYMSA9IGNvbF9za2lwKCkpKQ0KDQpwZXRyb2JyYXNfYXJnX3NlZ21lbnRvcyA8LSByZWFkX2NzdigiLi4vZGF0YS9iYWxhbmNlcy9wZXRyb2JyYXNfYXJnX3NlZ21lbnRvcy5jc3YiLCANCiAgICBjb2xfdHlwZXMgPSBjb2xzKFgxID0gY29sX3NraXAoKSkpDQoNCnlwZl9zZWdtZW50b3MgPC0gcmVhZF9jc3YoIi4uL2RhdGEveXBmL3lwZl9zZWdtZW50b3MuY3N2IiwgDQogICAgY29sX3R5cGVzID0gY29scyhYMSA9IGNvbF9za2lwKCkpKQ0KDQpgYGANCg0KIyMgUG9yIGVtcHJlc2ENCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpncmFmX3RnX2VtcCA8LSBiYWxhbmNlc19hcmcgJT4lDQogIGZpbHRlcih0Z19hbnQgIT0gSW5mKSAlPiUNCiAgZ2dwbG90KGFlcyhmZWNoYSwgdGdfYW50LCBjb2xvciA9IGVtcHJlc2EpKSsNCiAgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkrDQogIGxhYnModGl0bGUgPSAiVGFzYSBkZSBnYW5hbmNpYSBlbXByZXNhcyBoaWRyb2NhcmJ1cm9zIiwNCiAgICAgICBzdWJ0aXRsZSA9ICAiQW50ZXMgZGUgaW1wdWVzdG9zIikrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSsNCiAgZmFjZXRfd3JhcCh+c2VjdG9yKQ0KDQpnZ3Bsb3RseShncmFmX3RnX2VtcCwgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCmBgYA0KDQojIyBQb3Igc3Vic2VjdG9yDQoNCmBgYHtyfQ0KYmFsYW5jZXNfYXJnICU+JQ0KICAjIGZpbHRlcih1bmlkYWQgPT0gIk1pbGxvbmVzIGRlIHBlc29zIikgJT4lDQogIGZpbHRlcihtb25lZGEgPT0gIk1NX3Blc29zIikgJT4lICMgQVJSRUdMQVIgISENCiAgZ3JvdXBfYnkoZmVjaGEsIHNlY3RvcikgJT4lDQogIHN1bW1hcmlzZSgiVEcgYW50ZXMgZGUgaW1wdWVzdG9zIiA9IHN1bShnY2lhX2FudCxuYS5ybSA9IFQpL3N1bSAoS1RBLG5hLnJtID0gVCksDQogICAgICAgICAiVEcgZGVzcHVlcyBkZSBpbXB1ZXN0b3MiID0gc3VtKGdjaWFfYW50LCBpbXB1ZXN0b19nY2lhLCBuYS5ybSA9IFQpL3N1bShLVEEsIG5hLnJtID0gVCApICkgJT4lDQogIGdhdGhlcihrZXkgPSB2YXJpYWJsZSwgdmFsdWUgPSB2YWxvciwgMzo0KSAlPiUNCiAgZmlsdGVyKHZhcmlhYmxlID09IlRHIGRlc3B1ZXMgZGUgaW1wdWVzdG9zIikgJT4lDQogIGdncGxvdChhZXMoZmVjaGEsIHZhbG9yLCBjb2xvciA9IHNlY3RvcikpKw0KICBnZW9tX2xpbmUoKSsNCiAgZ2VvbV9wb2ludCgpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSsNCiAgbGFicyh0aXRsZSA9ICJUYXNhIGRlIGdhbmFuY2lhIGVtcHJlc2FzIGhpZHJvY2FyYnVyb3MiLA0KICAgICAgIHN1YnRpdGxlID0gICJBbnRlcyB5IGRlc3B1w6lzIGRlIGltcHVlc3RvcyIpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkrDQogIGZhY2V0X3dyYXAofnZhcmlhYmxlKQ0KDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ3JhZl90Z195cGYgPC0geXBmX3NlZyAlPiUNCiAgIyBmaWx0ZXIoc2VjdG9yICVpbiUgYygicXVpbWljYSIsICJkb3duc3RyZWFtIiwgInVwc3RyZWFtIikpICU+JQ0KICBmaWx0ZXIoc2VjdG9yICE9ICJhZG1fY2VudHJhbCIpICU+JQ0KICBnZ3Bsb3QoYWVzKGZlY2hhLCB0Z19hY3Rpdm8sIGNvbG9yID0gc2VjdG9yKSkrDQogIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KCkrDQogICMgZmFjZXRfd3JhcCh+c2VjdG9yKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSsNCiAgbGFicyh0aXRsZSA9ICJUYXNhIGRlIGdhbmFuY2lhIGRlIHNlZ21lbnRvcyBZUEYiKQ0KZ3JhZl90Z195cGYNCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpncmFmX3RnX3BldHJvYnJhcyA8LSBwZXRyb2JyYXNfYXJfc2VnICU+JQ0KICBmaWx0ZXIoc2VjdG9yICVpbiUgYygicGV0cm9xdWltaWNhIiwgImRvd25zdHJlYW0iLCAidXBzdHJlYW0iLCAiZ2FzX3lfZW5lcmdpYSIpKSAlPiUNCiAgIyBmaWx0ZXIoc2VjdG9yICE9ICJhZG1fY2VudHJhbCIpICU+JQ0KICBnZ3Bsb3QoYWVzKGZlY2hhLCB0ZywgY29sb3IgPSBzZWN0b3IpKSsNCiAgZ2VvbV9saW5lKCkrDQogICMgZmFjZXRfd3JhcCh+c2VjdG9yKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSsNCiAgbGFicyh0aXRsZSA9ICJUYXNhIGRlIGdhbmFuY2lhIGRlIHNlZ21lbnRvcyBQZXRyb2JyYXMgQXJnZW50aW5hIikNCmdyYWZfdGdfcGV0cm9icmFzDQpgYGANCiMgUmVudGEgZGUgbGEgdGllcnJhIGhpZHJvY2FyYnVyw61mZXJhDQoNCiMjIE3DqXRvZG8gZGlyZWN0byAoZGVzY3VlbnRvcyBzb2JyZSBlbCBWQlApDQoNCiMjIE3DqXRvZG8gaW5kaXJlY3RvIChzdW1hIGRlIG1lY2FuaXNtb3MpDQoNCiMjIyBEaWZlcmVuY2lhbCBkZSBwcmVjaW9zDQoNCiMjIyBTb2JyZXZhbHVhY2lvbiBjYW1iaWFyaWENCg0KIyMjIEltcHVlc3RvcyBlc3BlY8OtZmljb3MNCg0KDQo=